9.9 Container
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.
- JTabbedPane: Zeigt Reiter in einem Karteikasten an.
- JSplitPane: Ermöglicht die Darstellung zweier Komponenten über- oder nebeneinander, wobei ein sogenannter Divider eine Größenveränderung erlaubt.
Dazu kommen noch Container wie die JToolBar oder RootPane, die wir uns für Abschnitt 9.19, »JRootPane und JDesktopPane *«, aufheben.
9.9.1 Standardcontainer (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 setBuffered().
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.
class javax.swing.JPanel |
- 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.
9.9.2 Bereich 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.
Beispiel |
Erzeuge eine JScrollPane, die immer Rollbalken besitzt, und setze eine Komponente hinein: JScrollPane sp = new JScrollPane( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, Die zu ummantelnde Komponente lässt sich auch im Konstruktor angeben. Die Container-Methode add() ist nicht geeignet! |
Der Viewport *
Den sichtbaren Ausschnitt der Fläche bestimmt ein JViewport-Objekt, das mit zusätzlichen Listenern etwa für die Änderungen des sichtbaren Bereichs ausgestattet werden kann. Die Methode getViewport() liefert das JViewport-Objekt. Die Methoden scrollRectToVisible(Rectangle) und setViewPosition(Point) des JViewport-Objekts ermöglichen die Ansteuerung des sichtbaren Bereichs.
Beispiel |
Zeige den sichtbaren Bereich auf dem Bildschirm an: System.out.println( scrollPane.getViewport().getVisibleRect() ); Die JViewport-Methode getVisibleRect() stammt aus der direkten Oberklasse JComponent. Sie liefert ein Rectangle-Objekt, und getLocation() liefert den java.awt.Point vom Rechteck oben links. |
Jeweils auf die gegenüberliegende Seite der Rollbalken lassen sich Zeilen- und Spaltenleisten legen, genauso wie in alle vier Ecken Komponenten. Die Leisten liegen selbst wiederum in einem JViewport, um zum Beispiel im Fall einer Linealbeschriftung mitzuwandern. setRowHeaderView(), setColumnHeaderView() und setCorner() setzen bei der JScrollPane die Ecken und Leisten.
Die Schnittstelle Scrollable *
Die komplexen Komponenten, wie etwa Textanzeigefelder, Bäume oder Tabellen, implementieren eine Verschiebefähigkeit nicht selbst, sondern müssen dazu in einer JScrollPane Platz nehmen. Damit JScrollPane jedoch weiß, wie zum Beispiel nach einem Klick auf den Bildlauf der Ausschnitt zu verändern ist, implementieren die Komponenten die Schnittstelle Scrollable. Die zentralen Klassen JList, JTable, JTextComponent und JTree implementieren die Schnittstelle und teilen auf diese Weise Maße der Komponente und Anzahl der Pixel bei einer Verschiebung mit, wenn etwa der Anwender den Rollbalken um eine Position versetzt.
9.9.3 Reiter (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 9.28: com/tutego/insel/ui/swing/JTabbedPaneDemo, main()
JFrame frame = new JFrame();
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() 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() 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 9.21: Screenshot von JTabbedPaneDemo
class javax.swing.JTabbedPane |
- 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.
9.9.4 Teilungskomponente (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 links/rechts unterteilt wird und der andere Teil wiederum eine JSplitPane enthält, die etwa oben/unten unterteilt.
Die Klasse JSplitPane verfügt über mehrere Konstruktoren.
class javax.swing.JSplitPane |
- 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. Nachträglich setzt set[Top|Bottom|Left|Right]Component(Component) bzw. setOrientation() sie. Die Methode setContinuousLayout(boolean) bestimmt, ob die JSplitPane während des Verschiebens des Dividers den Inhalt 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.
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.