15.26 JRootPane, JLayeredPane und JDesktopPane
 
Unter den JComponent-Objekten gibt es einige ausgezeichnete, die als Container für andere Kinder fungieren. JFrame und JWindow sowie JDialog enthalten als einziges Kind ein JRootPane-Objekt, was der Boden für eigene grafische Komponenten ist. Die Methode getRootPane() liefert dieses JRootPane-Objekt.
15.26.1 JRootPane und JLayeredPane
 
Ein JRootPane ist ein Container, der aus einer Glass-Pane und einer Layered-Pane besteht. Die Glass-Pane liegt über allen anderen Komponenten wie eine Glasscheibe.
Beispiel Weise der Glass-Pane einen wartenden Cursor zu.
Component c = getGlassPane();
if( c != null )
c.setCursor( Cursor.getPredefinedCursor( Cursor.WAIT_CURSOR ) );
|
Die Layered-Pane nimmt JComponent-Objekte auf und stellt sie in einer geschichteten Reihenfolge 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.
Wird ein JLayeredPane-Container verwendet, ist die add()-Methode so implementiert, dass die Komponenten auf einer Standardebene eingetragen werden. Dieser Ebene ist ein Wert zugewiesen, JLayeredPane.DEFAULT_LAYER. Um Komponenten auf eine eigene Ebene zu setzen, sodass sie vor oder hinter anderen Komponenten liegen, wird ihnen eine eigene Ebene zugewiesen, mit einem Wert relativ zu DEFAULT_LAYER. Kleinere Werte bedeuten, dass die Komponenten unten, und hohe, dass sie oben liegen. Ein Beispiel:
layeredPane.add( component, new Integer(5000) );
Für einige Ebenen sind Werte als Konstanten definiert. Dazu zählt zum Beispiel JLayeredPane.DEFAULT_LAYER (0), DRAG_LAYER (400), POPUP_LAYER (300).
Neben der Möglichkeit, die Ebenen festzusetzen, lässt sich die Reihenfolge später durch die Methode moveToFront() oder moveToBack() verändern.
15.26.2 JDesktopPane und die Kinder JInternalFrame
 
Die javax.swing.JDesktopPane ist eine Unterklasse von JLayeredPane und als Container für interne Fenster gedacht. Mit internen Fenstern (engl. internal frames) lassen sich MDI-Applikationen implementieren, also GUI-Anwendungen, bei denen Fenster nicht vom grafischen Betriebssystem verwaltet werden, sondern von der eigenen Anwendung.
 Hier klicken, um das Bild zu Vergrößern
In Java sind interne Fenster Exemplare vom Typ JInternalFrame. Ihre Möglichkeiten erinnern an JFrame, ein Unterschied ist aber etwa ein addInternalFrameListener() anstelle von addWindowListener() – das aber auch aus java.awt.Window und nicht aus JFrame kommt.
Bevor ein JInteralFrame 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 den JDesktopPane platziert werden. Der einfachste Konstruktor ist der Standard-Konstruktor, der ein nicht vergrößerbares, nicht schließbares, nicht maximierbares, 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 );
Listing 15.40
JInternalFrameDemo.java
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 );
}
}
|