Java SE 8 Standard-Bibliothek  
Professionelle Bücher. Auch für Einsteiger.
 
Inhaltsverzeichnis

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

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java SE 8 Standard-Bibliothek von Christian Ullenboom
Das Handbuch für Java-Entwickler
Buch: Java SE 8 Standard-Bibliothek

Java SE 8 Standard-Bibliothek
Pfeil 10 Grafische Oberflächen mit Swing
Pfeil 10.1 AWT, JavaFoundation Classes und Swing
Pfeil 10.1.1 Das Abstract Window Toolkit (AWT)
Pfeil 10.1.2 Java Foundation Classes (JFC)
Pfeil 10.1.3 Was Swing von AWT-Komponenten unterscheidet
Pfeil 10.2 Mit NetBeans zur ersten Swing-Oberfläche
Pfeil 10.2.1 Projekt anlegen
Pfeil 10.2.2 Eine GUI-Klasse hinzufügen
Pfeil 10.2.3 Programm starten
Pfeil 10.2.4 Grafische Oberfläche aufbauen
Pfeil 10.2.5 Swing-Komponenten-Klassen
Pfeil 10.2.6 Funktionalität geben
Pfeil 10.3 Aller Swing-Anfang – Fenster zur Welt
Pfeil 10.3.1 Eine Uhr, bei der die Zeit nie vergeht
Pfeil 10.3.2 Swing-Fenster mit javax.swing.JFrame darstellen
Pfeil 10.3.3 Mit add(…) auf den Container
Pfeil 10.3.4 Fenster schließbar machen – setDefaultCloseOperation(int)
Pfeil 10.3.5 Sichtbarkeit des Fensters
Pfeil 10.3.6 Größe und Position des Fensters verändern
Pfeil 10.3.7 Fenster- und Dialogdekoration, Transparenz *
Pfeil 10.3.8 Die Klasse Toolkit *
Pfeil 10.3.9 Zum Vergleich: AWT-Fenster darstellen *
Pfeil 10.4 Beschriftungen (JLabel)
Pfeil 10.4.1 Mehrzeiliger Text, HTML in der Darstellung
Pfeil 10.5 Icon und ImageIcon für Bilder auf Swing-Komponenten
Pfeil 10.5.1 Die Klasse ImageIcon
Pfeil 10.6 Es tut sich was – Ereignisse beim AWT
Pfeil 10.6.1 Die Ereignisquellen und Horcher (Listener) von Swing
Pfeil 10.6.2 Listener implementieren
Pfeil 10.6.3 Listener bei dem Ereignisauslöser anmelden/abmelden
Pfeil 10.6.4 Adapterklassen nutzen
Pfeil 10.6.5 Innere Mitgliedsklassen und innere anonyme Klassen
Pfeil 10.6.6 Aufrufen der Listener im AWT-Event-Thread
Pfeil 10.6.7 Ereignisse, etwas genauer betrachtet *
Pfeil 10.7 Schaltflächen
Pfeil 10.7.1 Normale Schaltflächen (JButton)
Pfeil 10.7.2 Der aufmerksame ActionListener
Pfeil 10.7.3 Schaltflächen-Ereignisse vom Typ ActionEvent
Pfeil 10.7.4 Basisklasse AbstractButton
Pfeil 10.7.5 Wechselknopf (JToggleButton)
Pfeil 10.8 Textkomponenten
Pfeil 10.8.1 Text in einer Eingabezeile
Pfeil 10.8.2 Die Oberklasse der Textkomponenten (JTextComponent)
Pfeil 10.8.3 Geschützte Eingaben (JPasswordField)
Pfeil 10.8.4 Validierende Eingabefelder (JFormattedTextField)
Pfeil 10.8.5 Einfache mehrzeilige Textfelder (JTextArea)
Pfeil 10.8.6 Editor-Klasse (JEditorPane) *
Pfeil 10.9 Swing Action *
Pfeil 10.10 JComponent und Component als Basis aller Komponenten
Pfeil 10.10.1 Hinzufügen von Komponenten
Pfeil 10.10.2 Tooltips (Kurzhinweise)
Pfeil 10.10.3 Rahmen (Border) *
Pfeil 10.10.4 Fokus und Navigation *
Pfeil 10.10.5 Ereignisse jeder Komponente *
Pfeil 10.10.6 Die Größe und Position einer Komponente *
Pfeil 10.10.7 Komponenten-Ereignisse *
Pfeil 10.10.8 UI-Delegate – der wahre Zeichner *
Pfeil 10.10.9 Undurchsichtige (opake) Komponente *
Pfeil 10.10.10 Properties und Listener für Änderungen *
Pfeil 10.11 Container
Pfeil 10.11.1 Standardcontainer (JPanel)
Pfeil 10.11.2 Bereich mit automatischen Rollbalken (JScrollPane)
Pfeil 10.11.3 Reiter (JTabbedPane)
Pfeil 10.11.4 Teilungskomponente (JSplitPane)
Pfeil 10.12 Alles Auslegungssache – die Layoutmanager
Pfeil 10.12.1 Übersicht über Layoutmanager
Pfeil 10.12.2 Zuweisen eines Layoutmanagers
Pfeil 10.12.3 Im Fluss mit FlowLayout
Pfeil 10.12.4 BoxLayout
Pfeil 10.12.5 Mit BorderLayout in alle Himmelsrichtungen
Pfeil 10.12.6 Rasteranordnung mit GridLayout
Pfeil 10.12.7 Der GridBagLayoutmanager *
Pfeil 10.12.8 Null-Layout *
Pfeil 10.12.9 Weitere Layoutmanager
Pfeil 10.13 Rollbalken und Schieberegler
Pfeil 10.13.1 Schieberegler (JSlider)
Pfeil 10.13.2 Rollbalken (JScrollBar) *
Pfeil 10.14 Kontrollfelder, Optionsfelder, Kontrollfeldgruppen
Pfeil 10.14.1 Kontrollfelder (JCheckBox)
Pfeil 10.14.2 ItemSelectable, ItemListener und das ItemEvent
Pfeil 10.14.3 Sich gegenseitig ausschließende Optionen (JRadioButton)
Pfeil 10.15 Fortschritte bei Operationen überwachen *
Pfeil 10.15.1 Fortschrittsbalken (JProgressBar)
Pfeil 10.15.2 Dialog mit Fortschrittsanzeige (ProgressMonitor)
Pfeil 10.16 Menüs und Symbolleisten
Pfeil 10.16.1 Die Menüleisten und die Einträge
Pfeil 10.16.2 Menüeinträge definieren
Pfeil 10.16.3 Einträge durch Action-Objekte beschreiben
Pfeil 10.16.4 Mit der Tastatur – Mnemonics und Shortcut
Pfeil 10.16.5 Der Tastatur-Shortcut (Accelerator)
Pfeil 10.16.6 Tastenkürzel (Mnemonics)
Pfeil 10.16.7 Symbolleisten alias Toolbars
Pfeil 10.16.8 Popup-Menüs
Pfeil 10.16.9 System-Tray nutzen *
Pfeil 10.17 Das Model-View-Controller-Konzept
Pfeil 10.18 Auswahlmenüs, Listen und Spinner
Pfeil 10.18.1 Listen (JList)
Pfeil 10.18.2 Auswahlmenü (JComboBox)
Pfeil 10.18.3 Drehfeld (JSpinner) *
Pfeil 10.18.4 Datumsauswahl
Pfeil 10.19 Tabellen (JTable)
Pfeil 10.19.1 Ein eigenes Tabellen-Model
Pfeil 10.19.2 Basisklasse für eigene Modelle (AbstractTableModel)
Pfeil 10.19.3 Ein vorgefertigtes Standardmodell (DefaultTableModel)
Pfeil 10.19.4 Ein eigener Renderer für Tabellen
Pfeil 10.19.5 Zell-Editoren
Pfeil 10.19.6 Automatisches Sortieren und Filtern mit RowSorter *
Pfeil 10.20 Bäume (JTree)
Pfeil 10.20.1 JTree und sein TreeModel und TreeNode
Pfeil 10.20.2 Selektionen bemerken
Pfeil 10.20.3 Das TreeModel von JTree *
Pfeil 10.21 JRootPane und JDesktopPane *
Pfeil 10.21.1 Wurzelkomponente der Top-Level-Komponenten (JRootPane)
Pfeil 10.21.2 JDesktopPane und die Kinder von JInternalFrame
Pfeil 10.21.3 JLayeredPane
Pfeil 10.22 Dialoge und Window-Objekte
Pfeil 10.22.1 JWindow und JDialog
Pfeil 10.22.2 Modal oder nichtmodal?
Pfeil 10.22.3 Standarddialoge mit JOptionPane
Pfeil 10.22.4 Der Dateiauswahldialog
Pfeil 10.22.5 Der Farbauswahldialog JColorChooser *
Pfeil 10.23 Flexibles Java-Look-and-Feel
Pfeil 10.23.1 Look-and-Feel global setzen
Pfeil 10.23.2 UIManager
Pfeil 10.23.3 Die Windows-Optik mit JGoodies Looks verbessern *
Pfeil 10.24 Swing-Komponenten neu erstellen oder verändern *
Pfeil 10.24.1 Überlagerungen mit dem Swing-Komponenten-Dekorator JLayer
Pfeil 10.25 Die Zwischenablage (Clipboard)
Pfeil 10.25.1 Clipboard-Objekte
Pfeil 10.25.2 Mit Transferable auf den Inhalt zugreifen
Pfeil 10.25.3 DataFlavor ist das Format der Daten in der Zwischenablage
Pfeil 10.25.4 Einfügungen in der Zwischenablage erkennen
Pfeil 10.25.5 Drag & Drop
Pfeil 10.26 Undo durchführen *
Pfeil 10.27 AWT, Swing und die Threads
Pfeil 10.27.1 Ereignisschlange (EventQueue) und AWT-Event-Thread
Pfeil 10.27.2 Swing ist nicht threadsicher
Pfeil 10.27.3 invokeLater(…) und invokeAndWait(…)
Pfeil 10.27.4 SwingWorker
Pfeil 10.27.5 Eigene Ereignisse in die Queue setzen *
Pfeil 10.27.6 Auf alle Ereignisse hören *
Pfeil 10.28 Barrierefreiheit mit der Java Accessibility API
Pfeil 10.29 Zeitliches Ausführen mit dem javax.swing.Timer
Pfeil 10.30 Die Zusatzkomponentenbibliothek SwingX
Pfeil 10.30.1 Im Angebot: Erweiterte und neue Swing-Komponenten
Pfeil 10.30.2 Überblick über erweiterte Standard-Swing-Klassen
Pfeil 10.30.3 Neue Swing-Klassen
Pfeil 10.30.4 Weitere SwingX-Klassen
Pfeil 10.30.5 SwingX-Installation
Pfeil 10.31 Zum Weiterlesen
 
Zum Seitenanfang

10.18Auswahlmenüs, Listen und Spinner Zur vorigen ÜberschriftZur nächsten Überschrift

Stehen dem Benutzer mehrere Möglichkeiten zur Auswahl, so gibt es GUI-Komponenten, die dem Benutzer genau diese Möglichkeiten zeigen. Das macht die Auswahl einfacher und schneller als ein Textfeld, denn aus einer Liste ist absehbar, welche Elemente genau existieren. Die Komponenten zur Auswahl beschreibt dieser Abschnitt.

 
Zum Seitenanfang

10.18.1Listen (JList) Zur vorigen ÜberschriftZur nächsten Überschrift

Eine JList zeigt in einer Spalte[ 102 ](Üblicherweise wählt die Liste eine Spalten-Darstellung. Eine JList kann jedoch die Einträge auch horizontal anordnen.) einige Einträge, aus denen der Benutzer wählen kann.

[zB]Beispiel

Erzeuge eine JList mit einigen Zeichenketten:

String[] listData = { "Shinguz", "Glapum'tianer", "Suffus", "Zypanon", "Tschung" };
JComponent jList = new JList( listData );

Anstatt dem Konstruktor in einem Feld die Daten zu geben, nimmt er auch Daten in einem Vector an.

class javax.swing.JList<E>
extends JComponent
implements Scrollable, Accessible
  • JList()
    Erzeugt eine neue leere List-Box.

  • JList(Object[] listData)

  • JList(Vector<? extends E> listData)
    Erzeugt eine Liste mit Daten, die dem Feld oder dem Vektor entstammen.

DefaultListModel als modifzierbares ListModel

Eine JList verwaltet Einträge immer in einem Listenmodell. Üblicherweise findet nicht der Konstruktor mit dem Objekt-Feld oder Vector Verwendung – der ein internes immutables Listenmodell aufbaut –, sondern ein Konstruktor, der ein eigenes Listenmodell annimmt.

Ein Standardlistenmodell, das von der API her dem java.util.Vector zum Verwechseln ähnlich sieht, ist das DefaultListModel<E>; Elemente lassen sich zu diesem Model einfach mit addElement(E element)hinzufügen.

Screenshot der Anwendung JListDemo

Abbildung 10.52Screenshot der Anwendung JListDemo

Listing 10.52com/tutego/insel/ui/list/JListDemo.java, main()

JFrame frame = new JFrame( "Levels of Happiness" );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

final DefaultListModel<String> lykkeligModel = new DefaultListModel<>();

for ( String s : ("1. Denmark,2. Switzerland,3. Austria," +
"4. Iceland,5. Bahamas,35. Germany," +
"174. Ukraine,178. Burundi,Ende").split(",") )
lykkeligModel.addElement( s );

JList<String> list = new JList<>( lykkeligModel );

list.addListSelectionListener( new ListSelectionListener() {
@Override public void valueChanged( ListSelectionEvent e ) {
if ( e.getValueIsAdjusting() )
return;

System.out.println( e );

if ( "Ende".equals( lykkeligModel.get( e.getLastIndex() ) ) )
System.exit( 0 );
}
} );

frame.add( new JScrollPane(list) );
frame.pack();
frame.setVisible( true );

[»]Hinweis

Eine JList bietet im Gegensatz zur AWT-Liste keine Scroll-Möglichkeit. Enthält eine JList mehr Zeilen, als auf dem Bildschirm sichtbar sind, muss die JList in eine JScrollPane eingebettet werden. Gleiches gilt für ein JTextArea-Objekt.

Die JList zeigt die Einträge über einen Listen-Renderer an. Bei der Auswahl eines Eintrags und beim Doppelklick löst die Komponente ein ListSelectionEvent aus, das ein ListSelectionListener meldet. Die Methode getValueIsAdjusting() vom ListSelectionEvent liefert true, wenn der Benutzer den Selektionsvorgang noch nicht abgeschlossen hat, weil er zum Beispiel mit einem Mausklick ein Element selektiert hat und mit gedrückter Maustaste auf andere Elemente geht. Aus dem ListSelectionEvent kann getFirstIndex()/getLastIndex() den Anfang und das Ende des Selektionsbereichs erfragen, und getElementAt(int) kann vom Listen-Model das Element erfragen.

class javax.swing.JList<E>
extends JComponent
implements Scrollable, Accessible
  • JList(ListModel<E> dataModel)
    Erzeugt die Liste mit einem spezifischen Model.

Da das Model die Daten beinhaltet, fehlen der JList-Komponente die Modifikationsmethoden, und es gibt auch keine Durchreichemethoden an das Model.

UML-Diagramm von DefaultListModel

Abbildung 10.53UML-Diagramm von DefaultListModel

Einen Eintrag selektieren

Eine JList kann nicht nur ein selektiertes Element besitzen, sondern auch eine Gruppe von Elementen (Intervall genannt) kann markiert sein. Welche Selektionsart möglich ist, bestimmt ein internes ListSelectionModel, das drei Konstanten deklariert:

  • SINGLE_SELECTION: Nur ein Element darf zur gleichen Zeit selektiert sein.

  • SINGLE_INTERVAL_SELECTION: Eine zusammenhängende Gruppe von Elementen darf selektiert sein.

  • MULTIPLE_INTERVAL_SELECTION: Auch nicht zusammenhängende Elemente können selektiert sein.

Die Methode setSelectionMode(int selectionMode) setzt eine neue Selektionsart bei der JList, wobei eine der drei genannten Konstanten übergeben wird:

class javax.swing.JList<E>
extends JComponent
implements Scrollable, Accessible
  • void setSelectionMode(int selectionMode)
    Setzt den Selektionsmodus. Das Argument kann die Werte ListSelectionModel.SINGLE_SELECTION (nur ein Eintrag), SINGLE_INTERVAL_SELECTION (mehrere Werte, aber in einem Intervall) oder, was der Standard ist, MULTIPLE_INTERVAL_SELECTION (beliebige Anzahl von Selektionen) annehmen.

  • int getSelectionMode()
    Liefert den Selektionsmodus.

Ereignis bei einer Selektion

Bei jeder Änderung der Selektion meldet die JList ein ListSelectionEvent, auf das ein ListSelectionListener reagiert. Die Erweiterung von EventObject deklariert drei Methoden:

class javax.swing.event.ListSelectionEvent
extends EventObject
  • int getFirstIndex()

  • int getLastIndex()

  • boolean getValueIsAdjusting()

Einer JList wird der Listener über addListSelectionListener() hinzugefügt.

class javax.swing.JList<E>
extends JComponent
implements Scrollable, Accessible
  • void addListSelectionListener(ListSelectionListener listener)
    Fügt einen Listener hinzu.

  • void removeListSelectionListener(ListSelectionListener listener)
    Entfernt den Listener.

Die Methoden haben wir im Beispielprogramm schon genutzt.

Zugriff auf selektierte Elemente und der Selektionsmodus

Außer im Ereignis-Listener auf die Selektionseigenschaften zuzugreifen, bietet die JList einige praktische Methoden (wie getSelectedIndex()), die bei einer einfachen Selektion direkt den Index des markierten Elements geben.

class javax.swing.JList<E>
extends JComponent
implements Scrollable, Accessible
  • void clearSelection()
    Löscht vorgenommene Selektionen.

  • int getSelectedIndex()
    Liefert die Position des selektierten Eintrags oder –1, wenn kein Element gewählt wurde.

  • int[] getSelectedIndices()
    Liefert die Positionen aller selektierten Einträge.

  • E getSelectedValue()
    Liefert den selektieren Eintrag oder null.

  • List<E> getSelectedValuesList()
    Liefert alle selektierten Einträge.

  • void ensureIndexIsVisible(int index)
    Bewegt die Liste in einem Ausschnitt, sodass der Eintrag an der Stelle index sichtbar ist.

Beispiel mit Textfeld, Schaltfläche und Liste

Eine Oberfläche soll eine Schaltfläche zum Löschen von selektierten Elementen einer Liste anbieten, genauso wie ein Textfeld zum Eintragen neuer Strings. Wir können dazu drei Swing-Komponenten vorsehen und ein DefaultListModel als Datenbehälter:

Listing 10.53com/tutego/insel/ui/list/JListAddElementsDemo.java, Ausschnitt 1

final DefaultListModel<String> listModel = new DefaultListModel<>();
final JList<String> list = new JList<>( listModel );
JButton btn = new JButton( "Remove" );
JTextField tf = new JTextField();

Für die Schaltfläche lässt sich folgender Ereignisbehandler vorsehen:

Listing 10.54com/tutego/insel/ui/list/JListAddElementsDemo.java, Ausschnitt 2

btn.addActionListener( new ActionListener() {
@Override public void actionPerformed( ActionEvent e ) {
int index = list.getSelectedIndex();
if ( index == –1 )
return;
listModel.remove( index );
}
} );

Gibt es kein selektiertes Element, liefert getSelectedIndex() die Rückgabe –1, und die Methode beendet die Verarbeitung.

Für das Textfeld nimmt der ActionListener einfach den Text heraus und setzt ihn per addElement(E element) in das DefaultListModel.

Listing 10.55com/tutego/insel/ui/list/JListAddElementsDemo.java, Ausschnitt 3

tf.addActionListener( new ActionListener() {
@Override public void actionPerformed( ActionEvent e ) {
String text = ((JTextField)e.getSource()).getText();
listModel.addElement( text );
((JTextField)e.getSource()).setText( "" );
}
} );

Renderer

Die Aufgabe eines Renderers ist es, die Elemente darzustellen. Standardmäßig nutzt die JList ein spezielles JLabel zur Darstellung, das die toString()-Methode auf jedem Listenelement aufruft und darstellt. Ein eigener Renderer ist leicht implementiert: Zunächst ist eine Klasse zu schreiben, die ListCellRenderer implementiert – am besten über die abstrakte Basisklasse DefaultListCellRenderer. Die JList-Methode setCellRenderer(ListCellRenderer) setzt ihn dann und verweist bei der Darstellung eines Eintrags auf dieses Objekt.

Die Schnittstelle ListCellRenderer

Abbildung 10.54Die Schnittstelle ListCellRenderer

DefaultListCellRenderer erweitert JLabel und implementiert ListCellRenderer.

Abbildung 10.55DefaultListCellRenderer erweitert JLabel und implementiert ListCellRenderer.

Ein Render-Beispiel gibt Abschnitt 10.19.4, »Ein eigener Renderer für Tabellen«, und auch die API-Dokumentation zeigt bei ListCellRenderer ein einfaches Beispiel.

 
Zum Seitenanfang

10.18.2Auswahlmenü (JComboBox) Zur vorigen ÜberschriftZur nächsten Überschrift

Ein Auswahlmenü (engl. choice box, auch combo box) zeigt eine Zeichenkette aus einer Liste von Möglichkeiten an. Wird die Choice-Box aufgeklappt, kann ein Element aus der List-Box gewählt werden. Ein neuer Eintrag erscheint dann im Titel des Menüs.

Die JComboBox ist das Swing-Auswahlmenü, das optional ein Textfeld zur Eingabe anbietet. In diesem Textfeld können Texte in beliebigen Modellen dargestellt und ausgewählt werden; ein Tastendruck lässt die Liste zu dem Eintrag springen, dessen Buchstabe eingegeben wurde. Ob das Textfeld editiert werden kann, bestimmt setEditable(boolean). Befinden sich zu viele Einträge in der Liste, stellt Swing automatisch eine scrollende Liste dar. Ab welcher Anzahl von Elementen die scrollende Liste dargestellt wird, bestimmt setMaximumRowCount(int). Mit addItem(E item) lassen sich Elemente dem assoziierten (generischen) ComboBoxModel<E> hinzufügen, mit removeItem(Object) lassen sie sich wieder entfernen, und getItemAt(index) erfragt ein Element. Das aktuell ausgewählte Element erfahren wir mit getSelectedItem() und den Index mit getSelectedIndex().

Beispiel einer JComboBox

Abbildung 10.56Beispiel einer JComboBox

Beim Auswählen eines Eintrags wird ein Action- und ItemEvent ausgelöst, mit dem wir das ausgewählte Objekt erfragen können:

Listing 10.56com/tutego/insel/ui/list/JComboBoxDemo.java, main()

JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

String[] lang = {
"Patronengurt", "Hausnummer", "Schmetterling", "Sphinx", "Anbetung",
"Ende"
};

// Nicht editierbare JComboBox
JComboBox<String> combo1 = new JComboBox<>();

for ( String s : lang )
combo1.addItem( s );

combo1.addActionListener( new ActionListener() {
@Override public void actionPerformed( ActionEvent e ) {
System.out.println( e );
JComboBox<?> selectedChoice = (JComboBox<?>) e.getSource();
if ( "Ende".equals( selectedChoice.getSelectedItem() ) )
System.exit( 0 );
}
} );

frame.add( combo1, BorderLayout.LINE_START );

// Editierbare JComboBox
JComboBox<String> combo2 = new JComboBox<>( lang );
combo2.setEditable( true );
combo2.setSelectedItem( "Sphinx" );
combo2.setMaximumRowCount( 4 );

frame.add( combo2, BorderLayout.LINE_END );

frame.pack();
frame.setVisible( true );

Die Methode addItem() funktioniert nur dann, wenn im Konstruktor kein spezielles Model angegeben wurde. Mit Modellen werden wir uns zu einem späteren Zeitpunkt näher beschäftigen. Sehen wir uns zunächst die Konstruktoren an.

class javax.swing.JComboBox<E>
extends JComponent
implements ItemSelectable, ListDataListener, ActionListener, Accessible
  • JComboBox()
    Erzeugt ein leeres Auswahlmenü mit einem Standard-Model.

  • JComboBox(E[] items)
    Erzeugt ein Auswahlmenü mit Elementen, die im Feld items angegeben sind.

  • JComboBox(Vector<?> items)
    Erzeugt ein Auswahlmenü mit Elementen, die im Vektor items abgelegt sind.

  • JComboBox(ComboBoxModel<E> aModel)
    Erzeugt ein Auswahlmenü mit einem Combo-Box-Model, das die Daten speichert.

Zur Selektion bzw. Abfrage selektierter Elemente bietet die Klasse weitere Methoden an:

  • Object getSelectedItem()
    Liefert die aktuelle Wahl zurück.

  • Object[] getSelectedObjects()
    Liefert ein Array mit den selektierten Einträgen.

  • int getSelectedIndex()
    Liefert den Index des aktuell selektierten Eintrags.

  • void setSelectedIndex(int position)
    Setzt den Eintrag im Titel des Menüs auf den Eintrag mit der Nummer position.

  • void setSelectedItem(Object anObject)
    Setzt den Eintrag string in die Titelleiste, wenn dieser in der Liste ist. Falls mehrere Einträge gleich dem string sind, wird jener Eintrag verwendet, der zuerst gefunden wurde. Dieser besitzt dann also den kleinsten Index.

Durchreichemethoden an das Model

Elemente lassen sich jetzt hinzufügen und löschen. Etwas seltsam erscheint uns die Tatsache, dass die JComboBox selbst diese Methoden anbietet. Ähnliche Swing-Komponenten (wie die JList oder JTable) bieten diese Anfrage- und Veränderungsmethoden nicht an, sondern erwarten direkt eine Änderung am Model und nicht an der Komponente. Das Besondere an Swing-Komponenten ist ja gerade, dass das Model verändert und abgefragt wird. Im Fall der JComboBox speichert sie die Daten natürlich immer noch nicht selbst, sondern leitet sie an das Model weiter. So sind diese Methoden nur Durchreichemethoden.

class javax.swing.JComboBox<E>
extends JComponent
implements ItemSelectable, ListDataListener, ActionListener, Accessible
  • void addItem(E item)
    Fügt dem Model einen Eintrag hinzu.

  • E getItemAt(int index)
    Liefert den Eintrag an der Position index. Die Rückgabe ist null, wenn sich der Index außerhalb des Bereichs befindet.

  • int getItemCount()
    Liefert die Anzahl der Einträge im Auswahlmenü.

  • void insertItemAt(E item, int index)
    Fügt einen Eintrag an einer bestimmten Stelle ein.

  • void removeItem(Object anObject)
    Löscht den Eintrag aus der Liste.

  • void removeItemAt(int position)
    Löscht den Eintrag an der Position position.

  • void removeAll()
    Entfernt alle Einträge aus dem Auswahlmenü.

Die Methoden zum Modifizieren des Models funktionieren nur dann, wenn das ComboBoxModel insbesondere ein MutableComboBoxModel ist.

Komplexe Typbeziehung von DefaultComboBoxModel

Abbildung 10.57Komplexe Typbeziehung von DefaultComboBoxModel

Ereignisse der JComboBox

Die JComboBox löst bei der Selektion zwei Arten von Ereignissen aus: ActionEvent und ItemEvent. Zudem lässt sich ein PopupMenuListener hinzufügen. Dem An- und Abmelden dienen die üblichen Methoden. Der Unterschied in den Ereignissen ActionEvent und ItemEvent ist:

  • Der ActionListener empfängt nur ein Ereignis bei einem neu gewählten Element.

  • Der ItemListener empfängt alle Veränderungen bei Selektionen. Das heißt, wenn der Benutzer ein neues Element anwählt, gibt es ein Ereignis für die Deselektion und eines für die Selektion. Geht der Benutzer etwa mit den Cursor-Tasten durch die Liste, rasselt es an Ereignissen.

class javax.swing.JComboBox<E>
extends JComponent
implements ItemSelectable, ListDataListener, ActionListener, Accessible
  • void addItemListener(ItemListener aListener)

  • void removeItemListener(ItemListener aListener)

  • void addActionListener(ActionListener l)

  • void removeActionListener(ActionListener l)

Wenn die Box mit setEditable(true) editierbar gemacht wurde und der Benutzer im Textfeld eine Eingabe getätigt hat, wird ebenfalls der ActionListener informiert, also kommt das Event zweimal! Dann lässt sich jedoch nicht mehr direkt der Ursprung des ActionEvent ersehen. Standardmäßig bleibt die Selektion unverändert, und insbesondere wird das Element nicht automatisch in das Model übertragen.

Zuordnung einer Taste mit einem Eintrag *

Bei der Benutzung einer JComboBox möchten Benutzer gern Elemente schnell per Tastatur auswählen. Ist etwa eine sortierte Auswahl mit Zeichenketten gegeben, sollte ein getippter Buchstabe zum ersten Eintrag führen, der mit diesem Buchstaben beginnt. Diese Funktionalität ist in Swing schon vorprogrammiert, kann aber noch erweitert werden. Dazu gilt es, einen KeySelectionManager zu implementieren. Dieser verbindet mit der gedrückten Taste (char) einen Index in der ComboBox (int). Unser nächstes Beispiel soll zeigen, wie eine Liste mit den ersten Buchstaben des Alphabets mit der Tastenauswahl 1, 2, 3 verbunden wird. Der interessanteste Teil ist die innere Klasse, die die Schnittstelle JComboBox.KeySelectionManager implementiert:

Listing 10.57com/tutego/insel/ui/list/JComboBoxKeySelection.java

JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

JComboBox<String> cb = new JComboBox<>( "A,B,C".split(",") );

cb.setKeySelectionManager( new JComboBox.KeySelectionManager() {
@SuppressWarnings( "rawtypes" )
@Override
public int selectionForKey( char aKey, ComboBoxModel aModel ) {
int pos = Math.abs( aKey1'0' );
return pos >= aModel.getSize() ? aModel.getSize()1 : pos;
}
} );

frame.add( cb );
frame.pack();
frame.setVisible( true );

Die Methode selectionForKey(…) bekommt den ausgewählten Buchstaben und das Model. Dieses Model ist nicht so unnötig, wie es auf den ersten Blick erscheint, denn es ist wichtig, aus ihm die maximale Anzahl an Elementen auszulesen, damit es zu keiner fehlerhaften Rückgabe kommt. Eine Bedingung testet, ob eine Auswahl getätigt wird, die zu einem ungültigen Eintrag führen würde.

 
Zum Seitenanfang

10.18.3Drehfeld (JSpinner) * Zur vorigen ÜberschriftZur nächsten Überschrift

Ein JSpinner ist eine Drehfeld-Komponente und besteht aus einem Eingabefeld (Editor) mit zwei kleinen Pfeilen, die eine Veränderung der Werte erlauben. Entweder trägt der Nutzer in das Textfeld eine gültige Zahl ein, die mit den Pfeilen verändert werden kann, oder es wird eine Liste von Auswahlelementen angezeigt, aus denen der Benutzer wählen kann. Am nächsten sind JSpinner mit Combo-Boxen verwandt, doch geht bei ihnen kein Popup-Menü auf.

SpinnerModel

Ein JSpinner arbeitet auf einem Model vom Typ SpinnerModel, das ähnlich wie ein Iterator den Zugriff auf die Elemente ermöglicht. Ein SpinnerModel wird im Konstruktor von JSpinner gesetzt oder über setModel(SpinnerModel).

SpinnerListModel

Ein vorgefertigtes Model ist das SpinnerListModel, das mit einem Feld initialisiert wird.

[zB]Beispiel

Erfrage alle Wochentage über die Klasse DateFormatSymbols. Das Feld von Zeichenfolgen soll dann ein SpinnerModel initialisieren. Dieses Model soll dem JSpinner im Konstruktor übergeben werden:

String[] days = new DateFormatSymbols().getWeekdays();
SpinnerModel model = new SpinnerListModel( days );
JSpinner spinner = new JSpinner( model );

SpinnerDateModel

Ein weiteres Model ist das SpinnerDateModel. Es erlaubt dem Benutzer lokalisierte Datumseingaben. Der JSpinner zeigt dann die Eingabezeile an, und das Model speichert die Benutzereingabe und bietet Abfragemethoden, um das gewählte Datum abzufragen.

[zB]Beispiel

Initialisiere den JSpinner mit einem SpinnerDateModel, und erfrage das gesetzte Datum:

SpinnerDateModel model = new SpinnerDateModel();
JSpinner spinner = new JSpinner( model );
Date value = model.getDate();

Der Konstruktor SpinnerDateModel(Date value, Comparable start, Comparable end, int stepSize) erlaubt die Angabe eines Start- und eines Enddatums. Sie können null sein, wenn keine Grenzen gewünscht sind. Die Variable stepSize gibt an, welches Format zu editieren ist. Dahinter stehen viele Konstanten aus Calendar, wie etwa YEAR, HOUR oder WEEK_OF_MONTH.

Screenshot der Anwendung JSpinnerDemo

Abbildung 10.58Screenshot der Anwendung JSpinnerDemo

Listing 10.58com/tutego/insel/ui/swing/JSpinnerDemo.java, main()

JFrame f = new JFrame();
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

f.setLayout( new BoxLayout(f.getContentPane(), BoxLayout.Y_AXIS) );


// Spinner für alle Zahlen zwischen 1 und 10 in Schritten von 0.2

SpinnerNumberModel model1 = new SpinnerNumberModel( 5.0, 0.0, 10.0, 0.2 );
JSpinner spin1 = new JSpinner( model1 );

f.add( spin1 );

// Spinner mit einem SpinnerListModel, gefüllt mit Comedians

String[] comedians = {
"Joseph Hader", "Charlie Chaplin", "Vicco von Bülow",
"Heinz Erhardt", "Michael Mittermeier" };

SpinnerListModel model2 = new SpinnerListModel( comedians );
JSpinner spin2 = new JSpinner( model2 );

f.add( spin2 );

f.pack();
f.setVisible( true );
 
Zum Seitenanfang

10.18.4Datumsauswahl Zur vorigen ÜberschriftZur nächsten Überschrift

Einen Dialog oder eine Komponente zur Auswahl eines Datums liefert Java nicht. Auf dem freien Markt gibt es allerdings einige Komponenten, die so etwas nachliefern. Unter ihnen sind zum Beispiel der JXDatePicker vom SwingX-Projekt (http://swingx.java.net/). Eine Vorstellung gibt die Seite http://www.javalobby.org/java/forums/t45447.html.

 


Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Java SE 8 Standard-Bibliothek Java SE 8 Standard-Bibliothek
Jetzt Buch bestellen

 Buchempfehlungen
Zum Rheinwerk-Shop: Java ist auch eine Insel
Java ist auch eine Insel


Zum Rheinwerk-Shop: Professionell entwickeln mit Java EE 8
Professionell entwickeln mit Java EE 8


Zum Rheinwerk-Shop: Besser coden
Besser coden


Zum Rheinwerk-Shop: Entwurfsmuster
Entwurfsmuster


Zum Rheinwerk-Shop: IT-Projektmanagement
IT-Projektmanagement


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2018. Original - https://www.rheinwerk-verlag.de/openbook/
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook 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.

 

 
 


12.12.2024 - Sitemap.xml