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
Download: - openbook, ca. 21,3 MB
Buch bestellen
Ihre Meinung?
<< zurück | Galileo Computing / <openbook> / Java 7 - Mehr als eine Insel | vor >>
Java 7 - Mehr als eine Insel von Christian Ullenboom Das Handbuch zu den Java SE-Bibliotheken
Java 7 - Mehr als eine Insel Galileo Computing 1433 S., 2012, geb. 49,90 Euro, ISBN 978-3-8362-1507-7 |
| 9 Grafische Oberflächen mit Swing
|  | 9.1 Fenster zur Welt
|  |  | 9.1.1 Swing-Fenster mit javax.swing.JFrame darstellen
|  |  | 9.1.2 Fenster schließbar machen – setDefaultCloseOperation()
|  |  | 9.1.3 Sichtbarkeit des Fensters
|  |  | 9.1.4 Größe und Position des Fensters verändern
|  |  | 9.1.5 Fenster- und Dialog-Dekoration, Transparenz *
|  |  | 9.1.6 Die Klasse Toolkit *
|  |  | 9.1.7 Dynamisches Layout während einer Größenänderung *
|  |  | 9.1.8 Zum Vergleich: AWT-Fenster darstellen *
|  | 9.2 Beschriftungen (JLabel)
|  |  | 9.2.1 Mehrzeiliger Text, HTML in der Darstellung
|  | 9.3 Icon und ImageIcon für Bilder auf Swing-Komponenten
|  |  | 9.3.1 Die Klasse ImageIcon
|  |  | 9.3.2 Die Schnittstelle Icon und eigene Icons zeichnen *
|  | 9.4 Es tut sich was – Ereignisse beim AWT
|  |  | 9.4.1 Die Ereignisquellen und Horcher (Listener) von Swing
|  |  | 9.4.2 Listener implementieren
|  |  | 9.4.3 Listener bei dem Ereignisauslöser anmelden/abmelden
|  |  | 9.4.4 Adapterklassen nutzen
|  |  | 9.4.5 Innere Mitgliedsklassen und innere anonyme Klassen
|  |  | 9.4.6 Aufrufen der Listener im AWT-Event-Thread
|  |  | 9.4.7 Ereignisse, etwas genauer betrachtet *
|  | 9.5 Schaltflächen
|  |  | 9.5.1 Normale Schaltflächen (JButton)
|  |  | 9.5.2 Der aufmerksame ActionListener
|  |  | 9.5.3 Schaltflächen-Ereignisse vom Typ ActionEvent
|  |  | 9.5.4 Basisklasse AbstractButton
|  |  | 9.5.5 Wechselknopf (JToggleButton)
|  | 9.6 Textkomponenten
|  |  | 9.6.1 Text in einer Eingabezeile
|  |  | 9.6.2 Die Oberklasse der Text-Komponenten (JTextComponent)
|  |  | 9.6.3 Geschützte Eingaben (JPasswordField)
|  |  | 9.6.4 Validierende Eingabefelder (JFormattedTextField)
|  |  | 9.6.5 Einfache mehrzeilige Textfelder (JTextArea)
|  |  | 9.6.6 Editor-Klasse (JEditorPane) *
|  | 9.7 Swing Action *
|  | 9.8 JComponent und Component als Basis aller Komponenten
|  |  | 9.8.1 Hinzufügen von Komponenten
|  |  | 9.8.2 Tooltips (Kurzhinweise)
|  |  | 9.8.3 Rahmen (Border) *
|  |  | 9.8.4 Fokus und Navigation *
|  |  | 9.8.5 Ereignisse jeder Komponente *
|  |  | 9.8.6 Die Größe und Position einer Komponente *
|  |  | 9.8.7 Komponenten-Ereignisse *
|  |  | 9.8.8 UI-Delegate – der wahre Zeichner *
|  |  | 9.8.9 Undurchsichtige (opake) Komponente *
|  |  | 9.8.10 Properties und Listener für Änderungen *
|  | 9.9 Container
|  |  | 9.9.1 Standardcontainer (JPanel)
|  |  | 9.9.2 Bereich mit automatischen Rollbalken (JScrollPane)
|  |  | 9.9.3 Reiter (JTabbedPane)
|  |  | 9.9.4 Teilungskomponente (JSplitPane)
|  | 9.10 Alles Auslegungssache: die Layoutmanager
|  |  | 9.10.1 Übersicht über Layoutmanager
|  |  | 9.10.2 Zuweisen eines Layoutmanagers
|  |  | 9.10.3 Im Fluss mit FlowLayout
|  |  | 9.10.4 BoxLayout
|  |  | 9.10.5 Mit BorderLayout in alle Himmelsrichtungen
|  |  | 9.10.6 Rasteranordnung mit GridLayout
|  |  | 9.10.7 Der GridBagLayoutmanager *
|  |  | 9.10.8 Null-Layout *
|  |  | 9.10.9 Weitere Layoutmanager
|  | 9.11 Rollbalken und Schieberegler
|  |  | 9.11.1 Schieberegler (JSlider)
|  |  | 9.11.2 Rollbalken (JScrollBar) *
|  | 9.12 Kontrollfelder, Optionsfelder, Kontrollfeldgruppen
|  |  | 9.12.1 Kontrollfelder (JCheckBox)
|  |  | 9.12.2 ItemSelectable, ItemListener und das ItemEvent
|  |  | 9.12.3 Sich gegenseitig ausschließende Optionen (JRadioButton)
|  | 9.13 Fortschritte bei Operationen überwachen *
|  |  | 9.13.1 Fortschrittsbalken (JProgressBar)
|  |  | 9.13.2 Dialog mit Fortschrittsanzeige (ProgressMonitor)
|  | 9.14 Menüs und Symbolleisten
|  |  | 9.14.1 Die Menüleisten und die Einträge
|  |  | 9.14.2 Menüeinträge definieren
|  |  | 9.14.3 Einträge durch Action-Objekte beschreiben
|  |  | 9.14.4 Mit der Tastatur: Mnemonics und Shortcut
|  |  | 9.14.5 Der Tastatur-Shortcut (Accelerator)
|  |  | 9.14.6 Tastenkürzel (Mnemonics)
|  |  | 9.14.7 Symbolleisten alias Toolbars
|  |  | 9.14.8 Popup-Menüs
|  |  | 9.14.9 System-Tray nutzen *
|  | 9.15 Das Model-View-Controller-Konzept
|  | 9.16 Auswahlmenüs, Listen und Spinner
|  |  | 9.16.1 Listen (JList)
|  |  | 9.16.2 Auswahlmenü (JComboBox)
|  |  | 9.16.3 Drehfeld (JSpinner) *
|  |  | 9.16.4 Datumsauswahl *
|  | 9.17 Tabellen (JTable)
|  |  | 9.17.1 Ein eigenes Tabellen-Model
|  |  | 9.17.2 Basisklasse für eigene Modelle (AbstractTableModel)
|  |  | 9.17.3 Ein vorgefertigtes Standard-Modell (DefaultTableModel)
|  |  | 9.17.4 Ein eigener Renderer für Tabellen
|  |  | 9.17.5 Zell-Editoren
|  |  | 9.17.6 Größe und Umrandung der Zellen *
|  |  | 9.17.7 Spalteninformationen *
|  |  | 9.17.8 Tabellenkopf von Swing-Tabellen *
|  |  | 9.17.9 Selektionen einer Tabelle *
|  |  | 9.17.10 Automatisches Sortieren und Filtern mit RowSorter *
|  | 9.18 Bäume (JTree)
|  |  | 9.18.1 JTree und sein TreeModel und TreeNode
|  |  | 9.18.2 Selektionen bemerken
|  |  | 9.18.3 Das TreeModel von JTree *
|  | 9.19 JRootPane und JDesktopPane *
|  |  | 9.19.1 Wurzelkomponente der Top-Level-Komponenten (JRootPane)
|  |  | 9.19.2 JDesktopPane und die Kinder von JInternalFrame
|  |  | 9.19.3 JLayeredPane
|  | 9.20 Dialoge und Window-Objekte
|  |  | 9.20.1 JWindow und JDialog
|  |  | 9.20.2 Modal oder nicht-modal?
|  |  | 9.20.3 Standarddialoge mit JOptionPane
|  |  | 9.20.4 Der Dateiauswahldialog
|  |  | 9.20.5 Der Farbauswahldialog JColorChooser *
|  | 9.21 Flexibles Java-Look-and-Feel
|  |  | 9.21.1 Look and Feel global setzen
|  |  | 9.21.2 UIManager
|  |  | 9.21.3 Die Windows-Optik mit JGoodies Looks verbessern *
|  | 9.22 Swing-Komponenten neu erstellen oder verändern *
|  |  | 9.22.1 Überlagerungen mit dem Swing-Komponenten-Dekorator JLayer
|  | 9.23 Die Zwischenablage (Clipboard)
|  |  | 9.23.1 Clipboard-Objekte
|  |  | 9.23.2 Mit Transferable auf den Inhalt zugreifen
|  |  | 9.23.3 DataFlavor ist das Format der Daten in der Zwischenablage
|  |  | 9.23.4 Einfügungen in der Zwischenablage erkennen
|  |  | 9.23.5 Drag & Drop
|  | 9.24 Undo durchführen *
|  | 9.25 AWT, Swing und die Threads
|  |  | 9.25.1 Ereignisschlange (EventQueue) und AWT-Event-Thread
|  |  | 9.25.2 Swing ist nicht thread-sicher
|  |  | 9.25.3 invokeLater() und invokeAndWait()
|  |  | 9.25.4 SwingWorker
|  |  | 9.25.5 Eigene Ereignisse in die Queue setzen *
|  |  | 9.25.6 Auf alle Ereignisse hören *
|  | 9.26 Barrierefreiheit mit der Java Accessibility API
|  | 9.27 Zeitliches Ausführen mit dem javax.swing.Timer
|  | 9.28 Die Zusatzkomponentenbibliothek SwingX
|  |  | 9.28.1 Im Angebot: Erweiterte und neue Swing-Komponenten
|  |  | 9.28.2 Überblick über erweiterte Standard-Swing-Klassen
|  |  | 9.28.3 Neue Swing-Klassen
|  |  | 9.28.4 Weitere SwingX-Klassen
|  |  | 9.28.5 SwingX-Installation
|  | 9.29 Alternativen zu programmierten Oberflächen, AWT und Swing *
|  |  | 9.29.1 Deklarative Beschreibungen der Oberfläche: Swing JavaBuilder, Swixml
|  |  | 9.29.2 SWT (Standard Widget Toolkit)
|  | 9.30 Zum Weiterlesen
## 9.22 Swing-Komponenten neu erstellen oder verändern * Zum Aufbau neuer Swing-Komponenten kommen eine Reihe von Möglichkeiten in Frage. Wenn es passend ist, lässt sich eine existierende Swing-Komponente als Basisklasse nehmen und um nötige Eigenschaften erweitern, sofern die Basisklassen diese Möglichkeit im Grunde schon bieten. Soll etwa ein Texteingabefeld nur IP-Adressen zulassen, so ist dafür keine völlig neue Textkomponentenimplementierung nötig, sondern nur eine Unterklasse der Standard-Komponente mit passendem Dokumenten-Modell. Oder soll eine Liste nur Kontrollkästen (mit Text) darstellen, ist das schon über die JList mit passendem Renderer und Modell möglich. Unproblematisch ist auch, wenn sich neue Komponenten aus anderen Swing-Teilkomponenten zusammensetzen lassen. Dann erweitert die neue Swing-Klasse einen Container wie JPanel, der einfach die anderen Elemente, wie gewünscht, platziert. Möglich ist dies zum Beispiel bei einer Statuszeile, da diese nichts Großartigeres macht, als einfach horizontal andere Komponenten anzuordnen und einen besonderen Rahmen zu setzen. Einen Dialog zur Auswahl eines Zeichensatzes bietet Swing bisher auch nicht an, der lässt sich aber als JDialog mit passenden Swing-Komponenten leicht nachbauen. Mehr Arbeit ist nötig, wenn sich auf keine allgemeinen Swing-Komponenten zurückgreifen lässt. Die Swing-Bibliothek bietet etwa keine Ribbon-Komponente, keinen wirklich guten HTML-Renderer oder kein Docking-Framework. Bei Anforderungen dieser Art ist spezieller Programmcode zum Zeichnen nötig. Der wesentliche Unterschied ist der, dass sich die Darstellung nicht vollständig an Standardkomponenten delegieren lässt, sondern immer etwas eigener Java-Code zum Zeichnen nötig ist. Um es richtig gut zu machen, sind für eine eigene Swing-Komponente drei Dinge nötig: Die Komponentenklasse, eine Modellklasse und ein UI-Delegate. Die Komponentenklasse ist die Hauptklasse und eine JComponent, die der Entwickler auf die GUI setzt. Sie bietet die API zum Setzen der Zustände. Die Modell-Daten werden nicht selbst in der Komponentenklasse gespeichert, sondern idealerweise über eine eigene Klasse modelliert. Die Tabelle nimmt zum Beispiel die Zellen aus einem Tabellenmodell, eine Textkomponente den Text aus einem Dokumentenmodell. Als Letztes bleibt der UI-Delegate, der das wirkliche Zeichnen und die Ereignisbehandlung übernimmt. Es kann sehr anspruchsvoll sein, ein gutes Aussehen und eine effektive Navigation zu erreichen, und es kann, insbesondere wenn die Komponente in verschiedenen Look and Feels arbeiten soll, eine Menge Arbeit werden. Und dass die eigene Swing-Komponente die UI-Eigenschaften wie Farben, Abstände und Antialiasing-Modus toleriert, ist selbstverständlich. ### 9.22.1 Überlagerungen mit dem Swing-Komponenten-Dekorator JLayer Können Swing-Komponten überlagert werden, können dadurch interessante Effekte erzieht werden. Ein paar Beispiele: Während ein Text in die Textbox geladen wird, erscheint ein JProgressBar. Bei aufwändigen Operationen wird das Haupt-Panel gesperrt, und eine drehende Sanduhr erscheint. Ist die Eingabe in einem Textfeld falsch, erscheint ein kleines Symbol, das über die ungültige Eingabe informiert. Über einer leeren Tabelle liegt eine Beschriftung, die erklärt, dass ein Doppelklick eine neue Zeile einfügt. Alle diese Darstellungen lassen sich mithilfe der in Java 7 eingefügten Klasse JLayer einfach lösen.[75](Nutzer vor Java 7 greifen auf SwingX (https://swingx.dev.java.net/) zurück, denn von dort kommt die Klasse auch; sie heißt nur dort JXLayer. Als Alternative haben Autoren auch oft auf Glass-Pane zurückgegriffen.) Die Haupteigenschaft von JLayer ist, sich um existierende Swing-Komponenten zu legen. Soll ein JLayer um ein Textfeld gelegt werden, heißt es:
    JLayer<JComponent> layer = new JLayer<JComponent>( textField );
Die zu ummantelnde Komponente wird über den Konstruktor angegeben und nicht über add(), da JLayer kein Container ist. Der nächste Schritt ist die Angabe eines Objekts, das das Zeichnen übernimmt.
    layer.setUI( layerUI );
Die Angabe erfordert ein LayerUI-Objekt, das eine paint()-Methode realisiert. Die Implementierung kann super.paint() aufrufen, um die ummantelte Komponente zu zeichnen, und dann eigenen Programmcode hinzufügen, um etwa eine Sanduhr darzustellen. Das folgende Beispiel fasst die Schritte zusammen und realisiert ein Programm, das bei Eingabe von »pu« einen kleinen roten Kreis anzeigt. Listing 9.84: com/tutego/insel/ui/swing/JLayerDemo.java, main()
    JFrame f = new JFrame();
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    f.setLayout( new BorderLayout(2, 2) );

    f.add( new JSeparator(), BorderLayout.PAGE_START );
    f.add( new JLabel( "Name:" ), BorderLayout.LINE_START );

    final JTextField textField = new JTextField();

    LayerUI<JComponent> layerUI = new LayerUI<JComponent>()
    {
      @Override
      public void paint( Graphics g, JComponent component )
      {
        super.paint( g, component );

        if ( textField.getText().equalsIgnoreCase( "pu" ) )
        {
          g.setColor( new Color( 255, 0, 0, 100 ) );
          g.fillOval( 0, component.getHeight() – 10, 10, 10 );
        }
      }
    };

    JLayer<JComponent> layer = new JLayer<JComponent>( textField );
    layer.setUI( layerUI );
    f.add( layer );
    f.add( new JSeparator(), BorderLayout.PAGE_END );

    f.pack();
    f.setVisible( true );
Die Klasse JLayer kann auch das Hauptpanel dekorieren und die Events auffangen. Das ist ein zweites Anwendungsfeld neben der Änderung der Darstellung. Die JLayer-Komponente kann einfach Events auffangen und verarbeiten und so zum Beispiel global für die Hilfe abfangen. ### Ihr Kommentar Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
<< zurück | <top> | vor >>
Zum Katalog
Java 7 – Mehr als eine Insel Jetzt bestellen
Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen? Ihre Meinung
Buchempfehlungen
| Java und XML
| Einstieg in Eclipse 3.7
| Android 3
| NetBeans Platform 7
| Java ist auch eine Insel
| Apps entwickeln für Android 4
| Java 7
Shopping
Versandkostenfrei bestellen in Deutschland und Österreich Info

Copyright © Galileo Press 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.

[Galileo Computing]
Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de