Java Standard: Grafische Oberflächen mit Swing: java awt LayoutManager: java awt BorderLayout

Aus Wikibooks


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.

Abbildung 1: BorderLayout mit fünf Bereichen
Abbildung 2: JFrame mit BorderLayout vergößert


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.

Abbildung 3: BorderLayout Komponentenorientierung


Ä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
...