15.20 JRootPane, JLayeredPane und JDesktopPane 

Unter den JComponent-Objekten gibt es einige ausgezeichnete, die als Container für andere Kinder fungieren.
15.20.1 Wurzelkomponente der Top-Level-Komponenten (JRootPane) 

Die Komponenten JFrame, JDialog, JWindow, JApplet und JInternalFrame enthalten als einziges Kind den leichtgewichtigen Container JRootPane. Die Methode getRootPane() liefert dieses JRootPane-Objekt. Die JRootPane verwaltet eine Layered-Pane, die wiederum Content-Pane und Menü aufnimmt, und eine Glass-Pane, die wie eine Glasscheibe über allen anderen Komponenten liegt. Sie kann Ereignisse abfangen oder in einer paint()-Methode etwas über alle Komponenten zeichnen.
Component c = getRootPane().getGlassPane(); if( c != null ) c.setCursor( Cursor.getPredefinedCursor( Cursor.WAIT_CURSOR ) ); |
15.20.2 JLayeredPane 

Die JLayeredPane nimmt JComponent-Objekte auf und stellt sie in einer geschichteten Reihenfolge (auch Z-Order genannt) dar. Die Layered-Pane besteht selbst wieder aus zwei Objekten, einer Menüzeile und der Inhaltsfläche Content-Pane. Container vom Typ JLayeredPane platzieren ihre Kinder in Ebenen (engl. layers). Jedem Kind wird eine Ebene zugewiesen, und beim Zeichnen werden die Kinder von unten nach oben gezeichnet. Damit werden die Komponenten, die unter anderen Komponenten liegen, unter Umständen verdeckt. Standardmäßig hat die JLayeredPane keinen zugewiesenen Layout-Manager, und Objekte müssen mit setBounds() positioniert werden.
Wird ein JLayeredPane-Container verwendet, ist die add()-Methode so implementiert, dass sie die Komponenten auf einer Standardebene (JLayeredPane.DEFAULT_LAYER) platziert. Um Komponenten auf eine eigene Ebene zu setzen, sodass sie vor oder hinter anderen Komponenten liegen, wird ihnen eine eigene Ebene zugewiesen, und zwar mit einem Wert relativ zu DEFAULT_LAYER. Kleinere Werte bedeuten, dass die Komponenten unten liegen, und hohe bedeuten, dass sie oben liegen. Ein Beispiel:
layeredPane.add( component, new Integer(5000) );
Für einige Ebenen sind Werte als Konstanten deklariert. Dazu zählen zum Beispiel JLayeredPane.DEFAULT_LAYER (0), PALETTE_LAYER (100), MODAL_LAYER (200), POPUP_LAYER (300) und DRAG_LAYER (400).
Neben der Möglichkeit, die Ebenen festzusetzen, lässt sich die Reihenfolge später durch die Methode moveToFront() oder moveToBack() verändern.
15.20.3 JDesktopPane und die Kinder JInternalFrame 

Die JDesktopPane ist eine Unterklasse von JLayeredPane und als Container für interne Fenster – also Objekte vom Typ JInternalFrame – gedacht. Mit internen Fenstern (engl. internal frames) lassen sich MDI-Applikationen implementieren, also GUI-Anwendungen, bei denen nicht das grafische Betriebssystem die Fenster verwaltet, sondern die eigene Anwendung.
|
Bevor ein JInternalFrame sichtbar wird, muss der Container erzeugt und sichtbar gemacht werden.
JDesktopPane desktop = new JDesktopPane(); container.add( desktop );
Jetzt können beliebig viele JInternalFrame-Objekte erzeugt und auf der JDesktopPane platziert werden. Der einfachste Konstruktor ist der Standard-Konstruktor, der ein nicht vergrößerbares, nicht schließbares, nicht maximierbares und nicht zum Icon verkleinerbares JInternalFrame ohne Titel erzeugt. Der ausführlichste Konstruktor erlaubt eine genaue Parametrisierung.
JInternalFrame iframe = new JInternalFrame( title, resizable, closeable, maximizable, iconifiable );
Zwar gibt es nun ein Exemplar, doch würde es nach dem Aufsetzen auf den Container noch nicht sichtbar sein.
iframe.setVisible( true );
Bis zur Vollständigkeit fehlen aber noch die Ausmaße:
iframe.setSize( /* width = */ 200, /* height = */ 100 );
Nun kann der iframe dem Container hinzugefügt werden:
desktop.add( iframe );
In einem kompletten Programm kann das so aussehen:
Listing 15.64 com/tutego/insel/ui/swing/JInternalFrameDemo.java
package com.tutego.insel.ui.swing; import javax.swing.*; import static java.lang.Math.random; public class JInternalFrameDemo { static void addInternalToDesktop( JDesktopPane desktop ) { JInternalFrame iframe; iframe = new JInternalFrame( "Ein internes Fenster", // title true, // resizable true, // closeable true, // maximizable true ); // iconifiable iframe.setBounds( (int)(random() * 100), (int)(random() * 100), 100 + (int)(random() * 400), 100 + (int)(random() * 300) ); iframe.add( new JScrollPane(new JTextArea()) ); iframe.setVisible( true ); desktop.add( iframe ); } public static void main( String[] args ) { JFrame f = new JFrame(); f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); JDesktopPane desktop = new JDesktopPane(); f.add( desktop ); f.setSize( 500, 400 ); addInternalToDesktop( desktop ); addInternalToDesktop( desktop ); addInternalToDesktop( desktop ); f.setVisible( true ); } }