8.8.5 | Das CardLayout |
Wie der Name andeutet, ordnet der CardLayout-Manager seine Komponenten wie einen Stapel Karteikarten an, von denen nur die oberste sichtbar ist. Alle Komponenten werden hierbei in der gleichen Größe dargestellt. Zum Blättern definiert der CardLayout-Manager vier Methoden, mit denen die nächste, die vorhergehende, die letzte oder die erste »Karte« sichtbar gemacht werden: next(), previous(), last() und first().
Weiterhin bietet der CardLayout-Manager die Möglichkeit, eine bestimmte Komponente gezielt anzuspringen. Hierzu definiert er die Methode show(), der der Name übergeben wird, unter dem die Komponente dem Container hinzugefügt wurde.
Dadurch nimmt der CardLayout-Manager eine Sonderrolle unter den Layout-Managern ein, weil dieses Layout gewissermaßen interaktiv ist, wohingegen die anderen Layout-Manager ihre Arbeit »im Hintergrund« verrichten, nachdem sie einmal konfiguriert worden sind. Diese Sonderrolle erfordert auch eine entsprechende Berücksichtigung bei der Implementierung: Beim CardLayout müssen die Komponenten stets unter Angabe eines Namens eingefügt werden, damit die Methode show() funktioniert. Daher ist bei Containern mit CardLayout grundsätzlich eine der beiden Varianten der add()-Methoden zu verwenden, die die Angabe eines weiteren String-Parameters erlauben.
Der Methode next() und den anderen Methoden zum Blättern von CardLayout muss der Container übergeben werden, in dem geblättert werden soll. Hierdurch werden Aufrufe dieser Methoden von außerhalb des Containers erleichtert. Die folgende Sequenz erzeugt ein Panel mit CardLayout:Panel imagePanel; CardLayout layout; ... imagePanel = new Panel() { public Dimension getPreferredSize() { return new Dimension(380, 380); } }; layout = new CardLayout(); imagePanel.setLayout(layout);Das Blättern kann dann aus einer beliebigen Methode ausgeführt werden, in der die Referenzen panel und layout verfügbar sind:layout.next(imagePanel);
Denkbare Anwendungsbereiche dieses Layouts sind Container, in denen zwischen mehreren Alternativen geblättert werden kann, beispielsweise ein Karteikasten, der einen »Stapel« Textfelder enthält, oder ein Fenster, in dem wie mit einem Diaprojektor Bilder betrachtet werden können.
Der Bildbetrachter soll folgende Eigenschaften besitzen:Um mit dem CardLayout-Manager zwischen den Bildern blättern zu können, müssen die Bilder in einen Container eingefügt werden. Bilder werden in Java durch die Klasse Image repräsentiert. Da Image selbst keine Unterklasse von Component ist, müssen die Bilder in eine selbstdefinierte Komponente eingebettet werden.
- Das Applet soll einen Anzeigebereich für die Bilder sowie vier Buttons besitzen, mit denen zwischen den Bildern geblättert werden kann. Das direkte Anwählen eines Bilds soll mit einer Auswahlbox möglich sein, die die Dateinamen der Bilder enthält.
- Die Bilder werden in ihrem Anzeigebereich unter Verwendung des CardLayout-Managers angezeigt.
- Die Anzahl der Bilder und die Namen der Bilddateien werden durch Parameter des Applets gesetzt.
Als Basis dieser Komponente soll uns die Klasse Canvas dienen. Wir definieren eine Klasse ImageCanvas, deren Konstruktor das anzuzeigende Bild übergeben wird:class ImageCanvas extends Canvas { Image img; public ImageCanvas(Image newImage) { img = newImage; prepareImage(img, this); }Anschließend wird die Methode paint() so überschrieben, dass sie das Bild anzeigt:public void paint(Graphics g) { g.drawImage(img, 0, 0, this); }Mit ImageCanvas steht uns nun eine Komponente zur Verfügung, mit der ein Bild »verpackt« werden kann. Exemplare dieser Klasse können nun von einem CardLayout-Manager in der gewünschten Weise verwaltet werden. Jetzt benötigen wir noch einen Container, in dem die Bilder angezeigt werden. In diesem Container soll der CardLayout-Manager agieren.
Hierzu wird ein Exemplar einer anonymen Unterklasse von Panel erzeugt, die eine Standardgröße vorgibt. Diesem Panel wird dann ein CardLayout gegeben:imagePanel = new Panel() { public Dimension getPreferredSize() { return new Dimension(380, 380); } }; layout = new CardLayout(); imagePanel.setLayout(layout);Diesem Panel werden dann die einzelnen Bilder in Form von ImageCanvas-Objekten hinzugefügt. Um ein bestimmtes Bild direkt anspringen zu können, werden die Bilder mit einem Namen versehen. Dieser Name kann der Methode CardLayout.show() übergeben werden. param enthält den Dateinamen des momentan verarbeiteten Bildes, der aus den Applet-Parametern ermittelt wird.Image img = getImage(getCodeBase(), param); imagePanel.add(new ImageCanvas(img), param);Zum Weiterblättern ist dann folgender Aufruf erforderlich:layout.next(imagePanel);Diese Anweisung und die entsprechenden Aufrufe der anderen Methoden zum Blättern werden im Event-Handler für die Buttons platziert. Als Letztes müssen dem Applet die Steuerelemente und die entsprechende Logik hinzugefügt werden. Hierzu werden die entsprechenden Komponenten eingebaut und die dazugehörigen Event-Handler implementiert.Material zum Beispiel
- Applet starten
- Quelltexte: