Advanced   Java   Services Die RootPaneContainer und der JRootPane Schichtenaufbau Back Next Up Home


RootPaneContainer

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.


Wie komme ich zu einem ContentPane
// 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.

Neu ab der Version 1.5

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);



JApplet, JDialog, JFrame, JWindow und JInternalFrame

In der folgenden Graphik sind die füünf RootPaneContainer in roter Schrift dargestellt.

RootPaneContainer.jpg


Der RootPaneSchichtenaufbau

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.

Schichtenaufbau_Neu.jpg


Folgerungen aus der Klassenhierarchie

Da eine JMenuBar sich von JComponent ableitet und zudem jede Swingkomponente ein Container ist ergeben sich folgende Möglichkeiten.

Valid XHTML 1.0 Strict top Back Next Up Home