15.4 Icon und ImageIcon für Bilder auf Swing-Komponenten 

Beschriftungen und Schaltflächen können unter Swing neben dem Text auch kleine Grafiken anzeigen. Der Schlüssel für Grafiken auf Swing-Komponenten liegt in der Klasse ImageIcon beziehungsweise in der Schnittstelle Icon, was ImageIcon implementiert. Ein Exemplar der Klasse ImageIcon kann mit vielen Parametern erzeugt werden. Die interessantesten stammen aus einer Datei und von einer URL. Ist die Grafik ein Animated-Gif, so stellt Swing es wirklich animiert dar. Swing berücksichtigt ebenso die Transparenz der Bilder.
Icon icon = new ImageIcon( "image.gif" ); |
|
Unser folgendes Beispiel soll auf eine Schaltfläche eine Grafik setzen. Nach dem Aktivieren der Schaltfläche soll ein Listener die Grafik wechseln.
Listing 15.5 com/tutego/insel/ui/swing/ImageIconDemo.java, Ausschnitt
URL resource1 = ImageIconDemo.class.getResource( "/images/user-trash-full.png" ); URL resource2 = ImageIconDemo.class.getResource( "/images/user-trash.png" ); Icon icon1 = new ImageIcon( resource1 ); Icon icon2 = new ImageIcon( resource2 ); JButton button = new JButton(); button.setIcon( icon1 ); frame.add( button ); frame.add( new JLabel( icon2 ) );
Das ausgeführte Beispiel ergibt folgendes Bild:
Abbildung 15.3 JButton mit Bild
Die Konstruktoren von JLabel und JButton nehmen ein Icon an und können dieses nach dem Erzeugen auch mit setIcon() ändern. Das obere Beispiel zeigt die Variante setIcon() für die Schaltfläche, es hätte aber auch new JButton(icon1) funktioniert.
|
Icon-Sammlungen
Wer für seine grafischen Oberflächen Icons einsetzt, der findet auf der Webseite http://tutego.com/go/eclipseicons über 1000 Icons von Eclipse. Sie lassen sich frei nutzen. Das Tango Desktop Projekt (http://tango.freedesktop.org/) bietet viele schöne Standard-Icons in den Auflösungen 16 × 16, 22 × 22, 32 × 32 und ebenso SVG. Die Webseite http://www.iconfinder.net/ bietet eine Suche nach bestimmen Begriffen und findet freie Icons nach weiteren Kriterien wie Hintergrundfarbe/Transparenz oder Größe.
Die beiden Linux-Oberflächen KDE und Gnome bieten viele Grafiken, die sich je nach Lizenzmodell auch in kommerziellen Produkten nutzen lassen. Für KDE ist http://www.kde-look.org/ eine zentrale Seite für das Aussehen. Ein Beispiel: Crystal Clear (http://www.everaldo.com/) steht unter LGPL und ist damit auch für kommerzielle Anwendungen nutzbar.
15.4.1 Die Schnittstelle Icon 

Bei einer genauen Betrachtung fällt auf, dass ImageIcon eine Implementierung der Schnittstelle Icon ist und dass die JLabel-Klasse ein Icon-Objekt erwartet und nicht speziell ein Argument vom Typ ImageIcon. Das heißt aber: Wir können auch eigene Icon-Objekte zeichnen. Dazu müssen wir nur drei spezielle Methoden von Icon implementieren: die Methode paintIcon() und ferner zwei Methoden, die die Dimensionen angeben.
interface javax.swing.Icon |
- int getIconWidth() Liefert die feste Breite eines Icons.
- int getIconHeight() Liefert die feste Höhe eines Icons.
- void paintIcon( Component c, Graphics g, int x, int y ) Zeichnet das Icon an die angegebene Position. Der Parameter Component wird häufig nicht benutzt. Er kann jedoch eingesetzt werden, wenn weitere Informationen beim Zeichnen bekannt sein müssen, wie etwa die Vorder- und Hintergrundfarbe oder der Zeichensatz.
Beispielimplementierung
Die folgende Klasse zeigt die Verwendung der Icon-Schnittstelle. Das eigene Icon soll einen einfachen roten Kreis mit den Ausmaßen 20 × 20 Pixel besitzen.
Listing 15.6 com/tutego/insel/ui/swing/MyIcon.java
package com.tutego.insel.ui.swing; import java.awt.*; import javax.swing.*; class MyIcon implements Icon { public void paintIcon( Component c, Graphics g, int x, int y ) { g.setColor( Color.red ); g.fillOval( x, y, getIconWidth(), getIconHeight() ); } public int getIconWidth() { return 20; } public int getIconHeight() { return 20; } }
Wir überschreiben die drei erforderlichen Methoden, sodass ein Icon-Objekt der Größe 20 × 20 Pixel entsteht. Als Grafik erzeugen wir einen gefüllten roten Kreis. Dieser kann als Stopp-Schaltfläche verwendet werden, ohne dass wir eine spezielle Grafik verwenden müssen. Für die Grafik stehen uns demnach 400 Pixel zur Verfügung – genau getIconWidth() mal get-IconHeight() –, und alle nicht gefüllten Punkte liegen transparent auf dem Hintergrund. Dies ist auch typisch für leichtgewichtige Komponenten. Über das Component-Objekt können wir weitere Informationen herausholen, wie etwa den aktuellen Zeichensatz oder das darstellende Frame-Objekt.
container.add( new JLabel( new MyIcon() ); |