Advanced Java Services | Die RootPaneContainer und der JRootPane Schichtenaufbau |
Ein RootPaneContainer ist ein Container der eine Instanz vom Typ JRootPane als einzige
Komponente beherbergt. Implementiert der Container zusätzlich noch das Interface RootPaneContainer,
so verpflichtet er sich, Methoden bereitzustellen, mit denen man einfach auf den Inhalt des
RootpaneContainers zugeifen kann. Diese Methoden sind nicht konzeptuell notwendig, sie dienen
lediglich dem leichteren Zugriff.
Es gibt in Swing fünf RootPaneContainer, die auch das entsprechende Interface implementieren.
JInternalFrame, das sich von JComponent ableitet, ist ein Lightweightcontainer, die anderen
vier JApplet, JDialog, JFrame, JWindow leiten sich nicht von
JComponent ab und sind daher HeavyweightContainer. Alle fünf Klassen haben jedoch denselben inneren
Aufbau. Instanzen dieser Klassen beinhalten jeweils ein Objekt vom Typ JRootPane. Will man Komponenten
in einen RootPaneContainer aufnehmen, so muß man diese an eine bestimmte Stelle innerhalb des
JRootPaneObjekts bringen: im Normalfall werden Komponenten in das sogenannte ContentPane aufgenommen.
Das RootPane selbst besteht aus zwei Teilen, aus einem vorne liegenden GlassPane und dem dahinter
liegenden JLayeredPane. Das GlassPane ist ein (zunächst) unsichtbares und undurchsichtiges JPanel.
Das dahinterliegende JLayeredPane ist ein Container der eine nahezu beliebige Zahl von Schichten
tragen kann. Ein neu instanziiertes JLayeredPaneObjekt enthält aber zunächst nur eine einzige Schicht,
die durch ein JPanel repräsentiert wird, das die hinterste Schicht mit der Positionsnummer -30000
darstellt. Dieses JPanel ist das sogenannte ContentPane und trägt hier ein BorderLayout.
In dieses Panel werden die Komponenten eines RootPaneContainers aufgenommen.
// falls man ein RootPane hat Container contentPane = rootPane.getContentPane() ; // falls man einen RootPaneContainer hat Container contentPane = rootPaneContainer.getRootPane().getContentPane() ; // oder kürzer, wenn das Interface RootPaneContainer implementiert ist Container contentPane = rootPaneContainer.getContentPane() ;
Das Aufnehmen von Komponenten in ein ContentPane geschieht mit den üblichen add-Methoden aus Container.
contentPane.add(child, Borderlayout.WEST) ; // z.Bsp.
Bis zur Version 1.4 war es notwendig, sich zum Aufnehmen von Komponenten zuerst das ContentPane zu beschaffen, also etwa:
jFrame.getContentPane().add(child, Borderlayout.WEST) ; //
In der Version 1.5 wurden die add()-Methoden der fünf RootPaneContainer neu geschrieben. Zitat aus der 1.5 API:
For conveniance JFrame, JDialog, JWindow, JApplet and JInternalFrame, by default,
forward, by default, all calls to the add, remove and setLayout methods,
to the contentPane.This means you can call:
rootPaneContainer.add(component);
instead of:
rootPaneContainer.getContentPane().add(component);
In der folgenden Graphik sind die füünf RootPaneContainer in roter Schrift dargestellt.
Die nächste Graphik zeigt den Schichtenaufbau eines RootPaneContainers. Jeder RootPaneContainer
verfügt über eine Methode
setJMenuBar(JMenubar mb)
und kann somit ein Menu tragen. Die JMenuBar wird in der gleichen Schicht realisiert wie das
ContentPane und bekommt den Index 1, was heißt, daß sie hinter dem ContentPane liegt.
Da eine JMenuBar sich von JComponent ableitet und zudem jede Swingkomponente ein Container ist ergeben sich folgende Möglichkeiten.