Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Neues in Java 7
2 Threads und nebenläufige Programmierung
3 Datenstrukturen und Algorithmen
4 Raum und Zeit
5 Dateien, Verzeichnisse und Dateizugriffe
6 Datenströme
7 Die eXtensible Markup Language (XML)
8 Dateiformate
9 Grafische Oberflächen mit Swing
10 Grafikprogrammierung
11 Netzwerkprogrammierung
12 Verteilte Programmierung mit RMI
13 RESTful und SOAP Web-Services
14 JavaServer Pages und Servlets
15 Applets
16 Datenbankmanagement mit JDBC
17 Technologien für die Infrastruktur
18 Reflection und Annotationen
19 Dynamische Übersetzung und Skriptsprachen
20 Logging und Monitoring
21 Java Native Interface (JNI)
22 Sicherheitskonzepte
23 Dienstprogramme für die Java-Umgebung
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
Java 7 - Mehr als eine Insel von Christian Ullenboom
Das Handbuch zu den Java SE-Bibliotheken
Buch: Java 7 - Mehr als eine Insel

Java 7 - Mehr als eine Insel
Rheinwerk Computing
1433 S., 2012, geb.
49,90 Euro, ISBN 978-3-8362-1507-7
Pfeil 9 Grafische Oberflächen mit Swing
Pfeil 9.1 Fenster zur Welt
Pfeil 9.1.1 Swing-Fenster mit javax.swing.JFrame darstellen
Pfeil 9.1.2 Fenster schließbar machen – setDefaultCloseOperation()
Pfeil 9.1.3 Sichtbarkeit des Fensters
Pfeil 9.1.4 Größe und Position des Fensters verändern
Pfeil 9.1.5 Fenster- und Dialog-Dekoration, Transparenz *
Pfeil 9.1.6 Die Klasse Toolkit *
Pfeil 9.1.7 Dynamisches Layout während einer Größenänderung *
Pfeil 9.1.8 Zum Vergleich: AWT-Fenster darstellen *
Pfeil 9.2 Beschriftungen (JLabel)
Pfeil 9.2.1 Mehrzeiliger Text, HTML in der Darstellung
Pfeil 9.3 Icon und ImageIcon für Bilder auf Swing-Komponenten
Pfeil 9.3.1 Die Klasse ImageIcon
Pfeil 9.3.2 Die Schnittstelle Icon und eigene Icons zeichnen *
Pfeil 9.4 Es tut sich was – Ereignisse beim AWT
Pfeil 9.4.1 Die Ereignisquellen und Horcher (Listener) von Swing
Pfeil 9.4.2 Listener implementieren
Pfeil 9.4.3 Listener bei dem Ereignisauslöser anmelden/abmelden
Pfeil 9.4.4 Adapterklassen nutzen
Pfeil 9.4.5 Innere Mitgliedsklassen und innere anonyme Klassen
Pfeil 9.4.6 Aufrufen der Listener im AWT-Event-Thread
Pfeil 9.4.7 Ereignisse, etwas genauer betrachtet *
Pfeil 9.5 Schaltflächen
Pfeil 9.5.1 Normale Schaltflächen (JButton)
Pfeil 9.5.2 Der aufmerksame ActionListener
Pfeil 9.5.3 Schaltflächen-Ereignisse vom Typ ActionEvent
Pfeil 9.5.4 Basisklasse AbstractButton
Pfeil 9.5.5 Wechselknopf (JToggleButton)
Pfeil 9.6 Textkomponenten
Pfeil 9.6.1 Text in einer Eingabezeile
Pfeil 9.6.2 Die Oberklasse der Text-Komponenten (JTextComponent)
Pfeil 9.6.3 Geschützte Eingaben (JPasswordField)
Pfeil 9.6.4 Validierende Eingabefelder (JFormattedTextField)
Pfeil 9.6.5 Einfache mehrzeilige Textfelder (JTextArea)
Pfeil 9.6.6 Editor-Klasse (JEditorPane) *
Pfeil 9.7 Swing Action *
Pfeil 9.8 JComponent und Component als Basis aller Komponenten
Pfeil 9.8.1 Hinzufügen von Komponenten
Pfeil 9.8.2 Tooltips (Kurzhinweise)
Pfeil 9.8.3 Rahmen (Border) *
Pfeil 9.8.4 Fokus und Navigation *
Pfeil 9.8.5 Ereignisse jeder Komponente *
Pfeil 9.8.6 Die Größe und Position einer Komponente *
Pfeil 9.8.7 Komponenten-Ereignisse *
Pfeil 9.8.8 UI-Delegate – der wahre Zeichner *
Pfeil 9.8.9 Undurchsichtige (opake) Komponente *
Pfeil 9.8.10 Properties und Listener für Änderungen *
Pfeil 9.9 Container
Pfeil 9.9.1 Standardcontainer (JPanel)
Pfeil 9.9.2 Bereich mit automatischen Rollbalken (JScrollPane)
Pfeil 9.9.3 Reiter (JTabbedPane)
Pfeil 9.9.4 Teilungskomponente (JSplitPane)
Pfeil 9.10 Alles Auslegungssache: die Layoutmanager
Pfeil 9.10.1 Übersicht über Layoutmanager
Pfeil 9.10.2 Zuweisen eines Layoutmanagers
Pfeil 9.10.3 Im Fluss mit FlowLayout
Pfeil 9.10.4 BoxLayout
Pfeil 9.10.5 Mit BorderLayout in alle Himmelsrichtungen
Pfeil 9.10.6 Rasteranordnung mit GridLayout
Pfeil 9.10.7 Der GridBagLayoutmanager *
Pfeil 9.10.8 Null-Layout *
Pfeil 9.10.9 Weitere Layoutmanager
Pfeil 9.11 Rollbalken und Schieberegler
Pfeil 9.11.1 Schieberegler (JSlider)
Pfeil 9.11.2 Rollbalken (JScrollBar) *
Pfeil 9.12 Kontrollfelder, Optionsfelder, Kontrollfeldgruppen
Pfeil 9.12.1 Kontrollfelder (JCheckBox)
Pfeil 9.12.2 ItemSelectable, ItemListener und das ItemEvent
Pfeil 9.12.3 Sich gegenseitig ausschließende Optionen (JRadioButton)
Pfeil 9.13 Fortschritte bei Operationen überwachen *
Pfeil 9.13.1 Fortschrittsbalken (JProgressBar)
Pfeil 9.13.2 Dialog mit Fortschrittsanzeige (ProgressMonitor)
Pfeil 9.14 Menüs und Symbolleisten
Pfeil 9.14.1 Die Menüleisten und die Einträge
Pfeil 9.14.2 Menüeinträge definieren
Pfeil 9.14.3 Einträge durch Action-Objekte beschreiben
Pfeil 9.14.4 Mit der Tastatur: Mnemonics und Shortcut
Pfeil 9.14.5 Der Tastatur-Shortcut (Accelerator)
Pfeil 9.14.6 Tastenkürzel (Mnemonics)
Pfeil 9.14.7 Symbolleisten alias Toolbars
Pfeil 9.14.8 Popup-Menüs
Pfeil 9.14.9 System-Tray nutzen *
Pfeil 9.15 Das Model-View-Controller-Konzept
Pfeil 9.16 Auswahlmenüs, Listen und Spinner
Pfeil 9.16.1 Listen (JList)
Pfeil 9.16.2 Auswahlmenü (JComboBox)
Pfeil 9.16.3 Drehfeld (JSpinner) *
Pfeil 9.16.4 Datumsauswahl *
Pfeil 9.17 Tabellen (JTable)
Pfeil 9.17.1 Ein eigenes Tabellen-Model
Pfeil 9.17.2 Basisklasse für eigene Modelle (AbstractTableModel)
Pfeil 9.17.3 Ein vorgefertigtes Standard-Modell (DefaultTableModel)
Pfeil 9.17.4 Ein eigener Renderer für Tabellen
Pfeil 9.17.5 Zell-Editoren
Pfeil 9.17.6 Größe und Umrandung der Zellen *
Pfeil 9.17.7 Spalteninformationen *
Pfeil 9.17.8 Tabellenkopf von Swing-Tabellen *
Pfeil 9.17.9 Selektionen einer Tabelle *
Pfeil 9.17.10 Automatisches Sortieren und Filtern mit RowSorter *
Pfeil 9.18 Bäume (JTree)
Pfeil 9.18.1 JTree und sein TreeModel und TreeNode
Pfeil 9.18.2 Selektionen bemerken
Pfeil 9.18.3 Das TreeModel von JTree *
Pfeil 9.19 JRootPane und JDesktopPane *
Pfeil 9.19.1 Wurzelkomponente der Top-Level-Komponenten (JRootPane)
Pfeil 9.19.2 JDesktopPane und die Kinder von JInternalFrame
Pfeil 9.19.3 JLayeredPane
Pfeil 9.20 Dialoge und Window-Objekte
Pfeil 9.20.1 JWindow und JDialog
Pfeil 9.20.2 Modal oder nicht-modal?
Pfeil 9.20.3 Standarddialoge mit JOptionPane
Pfeil 9.20.4 Der Dateiauswahldialog
Pfeil 9.20.5 Der Farbauswahldialog JColorChooser *
Pfeil 9.21 Flexibles Java-Look-and-Feel
Pfeil 9.21.1 Look and Feel global setzen
Pfeil 9.21.2 UIManager
Pfeil 9.21.3 Die Windows-Optik mit JGoodies Looks verbessern *
Pfeil 9.22 Swing-Komponenten neu erstellen oder verändern *
Pfeil 9.22.1 Überlagerungen mit dem Swing-Komponenten-Dekorator JLayer
Pfeil 9.23 Die Zwischenablage (Clipboard)
Pfeil 9.23.1 Clipboard-Objekte
Pfeil 9.23.2 Mit Transferable auf den Inhalt zugreifen
Pfeil 9.23.3 DataFlavor ist das Format der Daten in der Zwischenablage
Pfeil 9.23.4 Einfügungen in der Zwischenablage erkennen
Pfeil 9.23.5 Drag & Drop
Pfeil 9.24 Undo durchführen *
Pfeil 9.25 AWT, Swing und die Threads
Pfeil 9.25.1 Ereignisschlange (EventQueue) und AWT-Event-Thread
Pfeil 9.25.2 Swing ist nicht thread-sicher
Pfeil 9.25.3 invokeLater() und invokeAndWait()
Pfeil 9.25.4 SwingWorker
Pfeil 9.25.5 Eigene Ereignisse in die Queue setzen *
Pfeil 9.25.6 Auf alle Ereignisse hören *
Pfeil 9.26 Barrierefreiheit mit der Java Accessibility API
Pfeil 9.27 Zeitliches Ausführen mit dem javax.swing.Timer
Pfeil 9.28 Die Zusatzkomponentenbibliothek SwingX
Pfeil 9.28.1 Im Angebot: Erweiterte und neue Swing-Komponenten
Pfeil 9.28.2 Überblick über erweiterte Standard-Swing-Klassen
Pfeil 9.28.3 Neue Swing-Klassen
Pfeil 9.28.4 Weitere SwingX-Klassen
Pfeil 9.28.5 SwingX-Installation
Pfeil 9.29 Alternativen zu programmierten Oberflächen, AWT und Swing *
Pfeil 9.29.1 Deklarative Beschreibungen der Oberfläche: Swing JavaBuilder, Swixml
Pfeil 9.29.2 SWT (Standard Widget Toolkit)
Pfeil 9.30 Zum Weiterlesen

Rheinwerk Computing - Zum Seitenanfang

9.3 Icon und ImageIcon für Bilder auf Swing-KomponentenZur nächsten Überschrift

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 Schnittstelle Icon. Sollen vorhandene Grafiken einfach geladen werden, kommt die Klasse ImageIcon zum Einsatz, die ImageIcon implementiert.

Beispiel

Die folgende Zeile reicht aus, um ein Icon zu laden:

Icon icon = new ImageIcon( "image.gif" );


Rheinwerk Computing - Zum Seitenanfang

9.3.1 Die Klasse ImageIconZur nächsten ÜberschriftZur vorigen Überschrift

Unser folgendes Beispiel soll eine Grafik auf eine Schaltfläche setzen. Nach dem Aktivieren der Schaltfläche wechselt ein Listener die Grafik:

Listing 9.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

Abbildung 9.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. Das Beispiel nutzt den mit URL parametrisierten ImageIcon-Konstruktor. Die URL liefert getResource(), um Ressourcen – also die beiden Bilder – vom Klassenpfad zu beziehen. Wenn sich ImageIconDemo im Verzeichnis BASE/com/tutego/insel/ui/swing befindet, liegt die Grafik unter BASE/images/user-trash-full.png.

Hinweis

Ein Container bietet keine Methode add(Icon), sondern nur add(Component). Ein Icon-Objekt ist nicht vom Typ Component und kann daher auch nicht als Argument für eine add()-Methode dienen. Icons müssen erst auf Komponenten wie ein JLabel gesetzt werden, um sich darstellen zu lassen. Dennoch gibt es einige Konstruktoren/Methoden, die Icon-Objekte aufnehmen, etwa JLabel, JButton, JTabbedPane, JOptionPane, DefaultTreeCellRenderer.

ImageIcon-API

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.

Abbildung

Abbildung 9.4: Klassendiagramm von ImageIcon

Die wichtigsten Konstuktoren:

class javax.swing.ImageIcon
implements Accessible, Icon, Serializable
  • ImageIcon(byte[] imageData)
  • ImageIcon(Image image)
  • ImageIcon(String filename)
  • ImageIcon(URL location)
Hinweis

Die Klasse ImageIcon implementiert Serializable (die Schnittstelle Icon erweitert sie nicht). Doch die Serialisierung schreibt vom ImageIcon lediglich das interne unkomprimierte Byte-Feld mit den Farbwerten, und das Datenvolumen ist in der Regel größer als das Bild, aus dem das ImageIcon konstruiert wurde.

Icon-Sammlungen *

Wer für seine grafischen Oberflächen Icons einsetzt, der findet beim Tango Desktop Projekt (http://tango.freedesktop.org/) viele Standard-Icons in den Auflösungen 16×16, 22×22, 32×32 und ebenso im SVG-Format. 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/, http://commons.wikimedia.org/wiki/Crystal_Clear) steht unter der Lizenzform LGPL und ist damit auch für kommerzielle Anwendungen nutzbar. Die Webseite http://www.iconfinder.com/ ist eine Suchmaschine für Icons; ein Filter kann Icons bestimmter Größe genauso auswählen wie auch kommerziell nutzbare Icons.


Rheinwerk Computing - Zum Seitenanfang

9.3.2 Die Schnittstelle Icon und eigene Icons zeichnen *Zur nächsten ÜberschriftZur vorigen Überschrift

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 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.

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 9.6: com/tutego/insel/ui/swing/CircleIcon.java, CircleIcon

class CircleIcon implements Icon
{
@Override
public void paintIcon( Component c, Graphics g, int x, int y )
{
g.setColor( Color.red );
g.fillOval( x, y, getIconWidth(), getIconHeight() );
}

@Override
public int getIconWidth()
{
return 20;
}

@Override
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 getIconHeight() –, 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 die darstellende Vaterkomponente.

Um das eigene Icon auf ein JLabel zu setzen, lässt sich die Icon-Implementierung entweder im Konstruktor übergeben oder später über setIcon():

JLabel circle = new JLabel( new CircleIcon() );

Was die Typen Icon und Image verbindet

Vielleicht wird der eine oder andere sich schon überlegt haben, ob nun ImageIcon eine ganz eigene Implementierung neben der Image-Klasse ist oder ob beide miteinander verwandt sind. Das Geheimnis ist, dass ImageIcon die Icon-Schnittstelle implementiert, aber auch ImageIcon intern die Image-Klasse nutzt. Sehen wir uns das einmal im Detail an: Ein ImageIcon ist serialisierbar. Also implementiert es die Schnittstelle Serializable. Im Konstruktor kann ein URL-Objekt oder ein String mit einer URL stehen. Hier wird einfach getImage() vom Toolkit aufgerufen, um sich eine Referenz auf das Image-Objekt zu holen. Eine geschützte Methode loadImage(Image) wartet nun mithilfe eines MediaTrackers auf das Bild. Nachdem dieser auf das Bild gewartet hat, setzt er die Höhe und Breite, die sich dann über die Icon-Methoden abfragen lassen. Doch ein richtiges Icon muss auch paintIcon() implementieren. Hier verbirgt sich nur die drawImage()-Methode.

Kommen wir noch einmal auf die Serialisierbarkeit der ImageIcon-Objekte zurück. Die Klasse implementiert dazu die Methoden readObject() und writeObject(). Der Dateiaufbau ist sehr einfach. Breite und Höhe befinden sich im Datenstrom, und anschließend existiert ein Integer-Feld mit den Pixelwerten. In readObject() liest s.readObject() – wobei s der aktuelle ObjectInputStream ist – das Feld wieder ein, und über die Toolkit-Methode createImage() wird die Klasse MemoryImageSource genutzt, um das Feld wieder zu einem Image-Objekt zu konvertieren. Umgekehrt ist es genauso einfach. writeObject() schreibt die Breite und Höhe und anschließend das Ganzzahl-Feld mit den Farbinformationen, das es über einen PixelGrabber bekommen hat.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück
  Zum Katalog
Neuauflage: Java SE 8 Standard-Bibliothek
Neuauflage: Java SE 8 Standard-Bibliothek
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Professionell entwickeln mit Java EE 7






 Professionell
 entwickeln mit
 Java EE 7


Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: Einstieg in Eclipse






 Einstieg in Eclipse


Zum Katalog: Einstieg in Java






 Einstieg in Java


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2012
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de