8.3 | Top-Level-Container |
Top-Level-Container sind die obersten Container, die Komponenten wie Buttons beinhalten können. Zu dieser Gruppe gehören JApplet, JFrame, JDialog und JWindow.
Jede Top-Level-Komponente besitzt ein RootPane, in dem es neben einem JLayeredPane ein Glass-Pane gibt.
In einem JLayeredPane ist auf der Ebene FRAME_CONTENT_LAYER neben dem Content-Pane die optionale Menüleiste integriert.
Das Content-Pane (meist ein JPanel) dient dazu, die Komponenten aufzunehmen bzw. das Layout zu setzen:
JFrame f = new JFrame("Test"); f.getContentPane().setLayout(new BorderLayout()); f.getContentPane().add(new JButton("Drück mich"));
Das Glass-Pane, das standardmäßig nicht aktiviert (sichtbar) ist, bietet die Möglichkeit, bei Aktivierung (setVisible(true)) die Events für die Oberfläche zu filtern. Es werden dann alle Events zuerst an das Glass-Pane geliefert, welches dann selbst entscheiden kann, ob bestimmte Events an die entsprechende Komponente weitergeleitet werden sollen, oder nicht.
Zusätzlich können auf dem Glass-Pane grafische Elemente integriert werden.Material zum Beispiel
- Applet starten
- Quelltexte:
Sinnvoll ist dies beispielsweise, wenn nur ein bestimmter Button gedrückt werden darf, aber die anderen Elemente nicht deaktiviert erscheinen sollen. Ein anderes Einsatzgebiet ist die Simulation einer bestimmten Eingabesequenz, bei der dem Benutzer keine Interaktion mit dem System erlaubt wird. Hierbei kann zur Visualisierung auf dem Glass-Pane ein Mauszeiger animiert werden.
Um ein Fenster anzuzeigen, muss zunächst die Größe festgelegt werden. Hierzu gibt es verschiedene Möglichkeiten, die im Folgenden dargestellt werden:
- Aufruf von pack()
Mit dem Aufruf von pack() wird die Größe des Fensters aus den bevorzugten (getPreferredSize()) Ausmaßen der enthaltenen Komponenten ermittelt. Dies bedeutet typischerweise die minimale Größe, in der alle Komponenten noch ausreichend Platz haben.- Aufruf von setSize(int width, int height)
Durch den Aufruf von setSize() wird die Größe des Fensters explizit angegeben. Die Größe ermittelt sich jedoch aus dem Inhalt und den plattformabhängigen Rändern, wozu auch die Titelzeile des Fensters gehört. Die Titelzeile kann dabei aber unterschiedliche Ausmaße auf verschiedenen Betriebssystemen haben (so ist die Höhe der Titelleiste bei Windows XP deutlich größer als bei den vorherigen Windows-Versionen). Wenn die effektive Fläche für die Komponenten auf allen Plattformen gleich sein soll, muss eine der beiden anderen Alternativen benutzt werden.- Setzen der Größe des Content-Pane.
Eine effektive Möglichkeit, die Größe der Fläche für die Komponenten exakt zu setzen, zeigt das folgende Beispiel (eine Menüleiste wird dabei nicht berücksichtigt):JFrame f = new JFrame(); if (f.getContentPane() instanceof JComponent) ((JComponent) f.getContentPane()).setPreferredSize( new Dimension(200,200)); f.pack();In dem Beispiel wird die bevorzugte Größe des Content-Pane gesetzt, wodurch das anschließende pack() das Fenster hierzu passend skaliert. Da das Content-Pane lediglich von der Klasse java.awt.Container abgeleitet sein muss, ist ein Cast (Umwandeln in eine andere Klasse) in JComponent für die Methode setPreferredSize(Dimension d) vonnöten.
Neben dem Einstellen der Größe muss schließlich noch die Methode setVisible(true) aufgerufen werden.