Java Standard: Grafische Oberflächen mit Swing: java awt LayoutManager: java awt BorderLayout
BorderLayout
[Bearbeiten]- java.lang.Object
- java.awt.BorderLayout
Objekte der Klasse BorderLayout können einem Container in Java zugeordnet werden und das Layout dieser Container managen. Jedoch sollten Layout Manager wie BorderLayout nur Top-Level Containern und JPanels zugeordnet werden. Die anderen Container in Swing bieten eigene APIs zum Management des Layouts.
Der BorderLayout Manager unterteilt Container in fünf Bereiche, in denen Grafikkomponenten untergebracht werden können. Einem Bereich kann dabei immer nur eine Komponente zugeordnet werden. Möchte man zwei Komponenten in einem Bereich eines BorderLayouts unterbringen, muss man diese zunächst in einen neuen Container packen und dort den entsprechenden LayoutManager verwenden. Es empfiehlt sich, hierfür JPanel zu verwenden.
Der zugehörige Quelltext lautet wie folgt:
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.BorderLayout;
public class BorderLayoutManager{
private static void createAndShowGUI(){
// JFrame erzeugen
JFrame frame = new JFrame("JFrame mit BorderLayout");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Buttons erzeugen
JButton pageStart = new JButton("PAGE_START");
JButton pageEnd = new JButton("PAGE_END");
JButton center = new JButton("CENTER");
JButton lineStart = new JButton("LINE_START");
JButton lineEnd = new JButton("LINE_END");
// ContentPane haelt standardmaeßig ein BorderLayout
// Hinzufuegen der Buttons zum Content Pane des JFrames
frame.getContentPane().add(pageStart, BorderLayout.PAGE_START);
frame.getContentPane().add(center, BorderLayout.CENTER);
frame.getContentPane().add(pageEnd, BorderLayout.PAGE_END);
frame.getContentPane().add(lineStart, BorderLayout.LINE_START);
frame.getContentPane().add(lineEnd, BorderLayout.LINE_END);
// Framegroeße anpassen
// Frame sichtbar machen
frame.pack();
frame.setVisible(true);
}
public static void main(String[] bla){
// Diese Operation muss aufgrund Swings Threading-policy
// durchgeführt werden
javax.swing.SwingUtilities.invokeLater(new Runnable(){
public void run(){
createAndShowGUI();
}
});
}
}
Wie man anhand der beiden Screenshots erkennen kann, bestimmt der Layout Manager ebenfalls das Verhalten der den Bereichen zugeordneten Komponenten. Bei Größenänderung des Containers wird vom Layout Manager festgelegt, welche Bereiche wieviel Platz zugewiesen bekommen.
Komponenten Bereichen zuordnen
[Bearbeiten]Soll eine Komponente zu einem Bereich hinzugefügt werden, muss bei Hinzufügen mittels der add()-Methode der gewünschte Bereich angegeben werden. Dafür stehen in der Klasse BorderLayout folgende relativen Konstanten zur Verfügung. Es sollten bevorzugt die relativen Konstanten genutzt werden:
- CENTER
- Die Komponete wird in die Mitte des Containers gesetzt.
- Der Bereich CENTER nimmt immer den größten verfügbaren Raum ein. Bei Größenänderung bleibt diese Regel ebenfalls bestehen, da dies durch den Layout Manager festgelegt bzw. gesteuert wird.
- CENTER kann sich sowohl horizontal als auch vertikal ausdehnen.
- Zu beachten - die anderen Bereiche sind dadurch in ihrer Größe beschränkt. Steht nicht ausreichend Raum zur Verfügung, wird CENTER bevorzugt bahndelt.
- PAGE_START
- Die Komponente wird an die obere Grenze des Containers gesetzt.
- PAGE_START kann sich bei Größenänderung des Containers nur horizontal ausdehnen.
- Die vertikale Ausdehnung wird von
setPreferredSize(Dimension)
bestimmt.
- PAGE_END
- Die Komponente wird an die untere Grenze des Containers gesetzt.
- PAGE_END kann sich bei Größenänderung des Containers nur horizontal ausdehnen.
- Die vertikale Ausdehnung wird von
setPreferredSize(Dimension)
bestimmt.
- LINE_START
- Die Komponente wird an die linke Granze des Containers zwischen PAGE_START und PAGE_END gesetzt.
- LINE_START kann sich bei Größenänderung des Containers nur vertikal ausdehnen.
- Die horizontale Ausdehnung wird von
setPreferredSize(Dimension)
bestimmt.
- LINE_END
- Die Komponente wird an die rechte Grenze des Containers zwischen PAGE_START und PAGE_END gesetzt.
- LINE_END kann sich bei Größenänderung des Containers nur vertikal ausdehnen.
- Die horizontale Ausdehnung wird von
setPreferredSize(Dimension)
bestimmt.
Die Methode setPreferredSize(Dimension)
bewirkt, dass die Komponente diesen Raum einnimmt, falls soviel Raum zur Verfügung steht. Steht dieser Raum nicht zur Verfügung, weil beispielsweise der übergeordnete Container zu geringe Abmessungen hat, wird diese Festlegung von dem Layout Manager ignoriert.
Wird einem Container eine Komponente ohne Angabe des Bereichs in den sie gelegt werden soll übergeben, wird diese automatisch in CENTER abgelegt. Die vorher dort abgelegte Komponente wird im Layered Pane eine Ebene tiefer versetzt, bleibt aber auf CENTER gesetzt.
Container.add(Component);
// bewirkt das selbe wie
Container.add(Component, BorderLayout.CENTER);
Vor JDK Version 1.4 waren die bevorzugten Konstanten zur Bestimmung des Bereichs den Himmelsrichtungen nachempfunden. Diese absoluten Konstanten sollten nicht mit den relativen Konstanten vermischt genutzt werden:
- NORTH
- Bei Größenänderung des Containers nur horizontale Ausdehnung möglich.
- SOUTH
- Bei Größenänderung des Containers nur horizontale Ausdehnung möglich.
- WEST
- Bei Größenänderung des Containers nur vertikale Ausdehnung möglich.
- EAST
- Bei Größenänderung des Containers nur vertikale Ausdehnung möglich.
CENTER existierte ebenfalls bereits.
Freiraum zwischen den Komponenten
[Bearbeiten]Möchte man einen freien Raum zwischen den einzelnen Bereichen definieren, kann dies über den Konstruktor geschehen:
- horizontalGap
- Horizontaler Freiraum zwischen den Komponenten. Set()-Methode existiert ebenfalls.
- verticalGap
- Vertikaler Freiraum zwischen den Komponenten. Set()-Methode existiert ebenfalls.
JPanel contentPane = new JPanel(new BorderLayout(int horizontalGap, int verticalGap));
frame.setContentPane(contentPane);
Andere Möglichkeit, bei der der Aufruf der Methode jedoch an den Container weitergereicht wird.
frame.setLayout(new BorderLayout(int horizontalGap, int verticalGap))
Orientierung des Containers ändern
[Bearbeiten]Die PAGE und LINE Konstanten sind relativ und können somit auf Änderungen der Orientierung der Komponenten im Container reagieren. Im BorderLayout kann die horizontale Ausrichtung der Komponenten festgelegt werden:
- ComponentOrientation.LEFT_TO_RIGHT
- Bereiche werden von links nach rechts angeordnet
- ComponentOrientation.RIGHT_TO_LEFT
- Bereiche werden von rechts nach links angeordnet
Die Bereiche reagieren jedoch nur wenn sie mit den relativen Konstanten festgelegt wurden. Die Orientierung eines Containers lässt sich folgendermaßen ändern:
...
frame.getContentPane().applyComponentOrientation(java.awt.ComponentOrientation.RIGHT_TO_LEFT);
...
Nimmt man in obigem Beispiel nur diese Änderung vor, werden die Buttons von rechts nach links angeordnet.
Änderungen der vertikalen Orientierung bzw. Ausrichtung werden von BorderLayout nicht unterstützt.
Abwärtskompatibilität
[Bearbeiten]Um die Abwärtskompatibilität gewährleisten zu können, unterstützt BorderLayout ebenfalls die relativen Konstanten
- BEFORE_FIRST_LINE
- Entspricht PAGE_START
- AFTER_LAST_LINE
- Entspricht PAGE_END
- BEFORE_LINE_BEGINS
- Entspricht LINE_START
- AFTER_LINE_ENDS
- Entspricht LINE_END
Aus Gründen der konsistenten Verwendung relativer Konstanten in allen Komponenten sollten jedoch PAGE und LINE verwendet werden.
Sollten Sie auf folgende Variationen der add()-Methode treffen, gilt:
...
container.add(BorderLayout.CENTER, component) //gültig aber altertümlich
// oder
container.add("Center", component) //gültig aber Error Pane
...