10.11Container
Alle Komponenten müssen auf einem Container platziert werden. Container sind besondere Swing-Elemente, die dazu dienen, andere Kinder aufzunehmen und zu verwalten. Zu den wichtigsten Containern in Swing zählen:
JPanel: Ist im Wesentlichen eine JComponent mit der Möglichkeit, Kinder nach einem bestimmten Layoutverfahren anzuordnen.
JScrollPane: Kann Bereiche einer sehr großen Komponente mit Rollbalken anzeigen. Das ist von der Textverarbeitung bekannt, wenn der Text sehr lang ist, aber der Bildschirm viel kleiner.
JSplitPane: Ermöglicht die Darstellung zweier Komponenten über- oder nebeneinander, wobei ein so genannter Divider eine Größenveränderung erlaubt.
Dazu kommen noch Container wie die JToolBar oder RootPane, die wir uns für Abschnitt 10.21, »JRootPane und JDesktopPane *«, aufheben.
10.11.1Standardcontainer (JPanel)
Ein wichtiger Container unter Swing ist JPanel. Der zwischen einem Top-Level-Container wie JFrame und den Komponenten liegende Container (engl. intermediate container) erlaubt Doppel-Pufferung (engl. double buffering). Ist diese Pufferung eingeschaltet, werden alle Zeichenoperationen von Komponenten auf dem Panel auf einem Hintergrundbild (engl. offscreen image) ausgeführt und zu einem gewählten Zeitpunkt in den Vordergrund geschoben. Die Möglichkeit der Doppelpufferung lässt sich durch den Konstruktor setzen oder über die Methode setDoubleBuffered(boolean).
Die Klasse JPanel wird von uns in vielen Beispielen eingesetzt, dort aber lediglich als Container-Objekt. Neben den geerbten Methoden von JComponent, Container, Component und natürlich Object kommen keine nennenswerten Methoden hinzu.
extends JComponent
implements Accessible
JPanel()
Erzeugt ein neues JPanel mit Doppelpufferung und einem Flow-Layout.JPanel(boolean isDoubleBuffered)
Erzeugt ein neues JPanel mit Flow-Layout und der angegebenen Puffer-Strategie.
Sehr wichtig wird das JPanel zur Gruppierung von Elementen.
10.11.2Bereich mit automatischen Rollbalken (JScrollPane)
Die JScrollPane ermöglicht die Anzeige von Bereichen einer sehr großen Fläche. Rollbalken (JScrollBar-Objekte) synchronisieren automatisch den ausgewählten Bereich. Ob Rollbalken auch dann angezeigt werden sollen, wenn genug Platz ist, bestimmen Konstanten, die dem Konstruktor von JScrollPane übergeben werden.
[zB]Beispiel
Erzeuge eine JScrollPane, die immer Rollbalken besitzt, und setze eine Komponente hinein:
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS );
sp.setViewportView( componentToScroll );
Die zu ummantelnde Komponente lässt sich auch im Konstruktor angeben. Die Container-Methode add() ist nicht geeignet!
10.11.3Reiter (JTabbedPane)
Eine JTabbedPane hat mehrere Reiter mit eingebetteten Komponenten, die sie automatisch bei Aktivierung anzeigt. Als Beispiel bauen wir eine JTabbedPane mit zwei Reitern:
Listing 10.28com/tutego/insel/ui/swing/JTabbedPaneDemo.java, main()
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.addTab( "Reiter 1", new JButton( "Reiter 1" ) );
tabbedPane.addTab( "Reiter 2", new JTextArea() );
frame.add( tabbedPane );
frame.pack();
frame.setVisible( true );
Der Reiter kann nicht nur aus einem Titel bestehen, sondern kann zudem eine Grafik und einen Tooltip annehmen. Die Position der Reiteranzeigen bestimmen die Konstanten JTabbedPane.TOP, JTabbedPane.BOTTOM, JTabbedPane.LEFT und JTabbedPane.RIGHT, die entweder über den Konstruktor oder die Methode setTabPlacement(int) angegeben werden. Eine weitere Einstellung ist die Layout-Angabe, wenn der Container für den Reiter zu klein ist. Im Konstruktor oder über die Methode setTabLayoutPolicy(int) lassen sich folgende Reiter-Layouts angeben:
JTabbedPane.WRAP_TAB_LAYOUT für den Umbruch, der üblicherweise Standard ist, oder
JTabbedPane.SCROLL_TAB_LAYOUT, bei dem kleine Schaltflächen zum Weiterschalten angezeigt werden
Abbildung 10.37Screenshot von JTabbedPaneDemo
extends JComponent
implements Serializable, Accessible, SwingConstants
JTabbedPane()
Erzeugt einen Karteikasten und positioniert die Reiter oben.JTabbedPane(int tabPlacement)
Erzeugt einen Karteikasten mit gewünschter Reiter-Positionierung.JTabbedPane(int tabPlacement, int tabLayoutPolicy)
Erzeugt einen Karteikasten mit gewünschter Reiter-Positionierung und Umbruch-Strategie.void addTab(String title, Component component)
void addTab(String title, Icon icon, Component component)
void addTab(String title, Icon icon, Component component, String tip)
Fügt eine Komponente als Karteikarte hinzu.
10.11.4Teilungskomponente (JSplitPane)
Die JSplitPane ist ein Container, der Komponenten nebeneinander (HORIZONTAL_SPLIT) oder übereinander (VERTICAL_SPLIT) anordnet. Eine Bewegung des Dividers führt zu unterschiedlichen Größen der Komponenten im Container. Die JSplitPane lässt sich schachteln, sodass etwa ein Hauptbereich in einen linken und einen rechten unterteilt wird und der andere Teil wiederum eine JSplitPane enthält, die etwa oben/unten unterteilt.
Die Klasse JSplitPane verfügt über mehrere Konstruktoren:
extends JComponent
implements Accessible
JSplitPane()
JSplitPane(int newOrientation)
JSplitPane(int newOrientation, boolean newContinuousLayout)
JSplitPane(int newOrientation, boolean newContinuousLayout, Component newLeftComponent,
Component newRightComponent )JSplitPane(int newOrientation, Component newLeftComponent, Component newRightComponent)
Die Konstruktoren können die beiden Komponenten und auch die Orientierung annehmen. set[Top|Bottom|Left|Right]Component(Component) bzw. setOrientation() setzt sie nachträglich. Die Methode setContinuousLayout(boolean) bestimmt, ob die JSplitPane den Inhalt während des Verschiebens des Dividers aktualisiert oder erst am Ende. Die Methoden setDividerLocation(int) oder setDividerLocation(float) setzen das Verhältnis der beiden Komponenten in der JSplitPane. Im Fall von float ist die Angabe prozentual zwischen 0 und 1. Die Methode setOneTouchExpandable(boolean) bestimmt, ob kleine angezeigte Pfeile schnell die Anzeige zusammen- oder auffalten.