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

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Mathematisches
6 Eigene Klassen schreiben
7 Angewandte Objektorientierung
8 Exceptions
9 Die Funktionsbibliothek
10 Threads und nebenläufige Programmierung
11 Raum und Zeit
12 Datenstrukturen und Algorithmen
13 Dateien und Datenströme
14 Die eXtensible Markup Language (XML)
15 Grafische Oberflächen mit Swing
16 Grafikprogrammierung
17 Netzwerkprogrammierung
18 Verteilte Programmierung mit RMI und Web-Services
19 JavaServer Pages und Servlets
20 Applets
21 Midlets und die Java ME
22 Datenbankmanagement mit JDBC
23 Reflection und Annotationen
24 Logging und Monitoring
25 Sicherheitskonzepte
26 Java Native Interface (JNI)
27 Dienstprogramme für die Java-Umgebung
A Die Begleit-DVD
Stichwort

Download:
- ZIP, ca. 12,5 MB
Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java ist auch eine Insel von Christian Ullenboom
Programmieren mit der Java Standard Edition Version 6
Buch: Java ist auch eine Insel

Java ist auch eine Insel
7., aktualisierte Auflage
geb., mit DVD (November 2007)
1.492 S., 49,90 Euro
Galileo Computing
ISBN 978-3-8362-1146-8
Pfeil 15 Grafische Oberflächen mit Swing
Pfeil 15.1 Das Abstract Window Toolkit und Swing
Pfeil 15.1.1 Abstract Window Toolkit (AWT)
Pfeil 15.1.2 Java Foundation Classes
Pfeil 15.1.3 Was Swing von AWT unterscheidet
Pfeil 15.1.4 Die Klasse Toolkit
Pfeil 15.2 Fenster unter grafischen Oberflächen
Pfeil 15.2.1 Swing-Fenster darstellen
Pfeil 15.2.2 AWT-Fenster darstellen
Pfeil 15.2.3 Sichtbarkeit des Fensters
Pfeil 15.2.4 Größe und Position des Fensters verändern
Pfeil 15.2.5 Unterklassen der Fenster-Klassen bilden
Pfeil 15.2.6 Fenster- und Dialog-Dekoration
Pfeil 15.2.7 Dynamisches Layout während einer Größenänderung
Pfeil 15.3 Beschriftungen (JLabel)
Pfeil 15.3.1 Mehrzeiliger Text, HTML in der Darstellung
Pfeil 15.4 Icon und ImageIcon für Bilder auf Swing-Komponenten
Pfeil 15.4.1 Die Schnittstelle Icon
Pfeil 15.5 Es tut sich was – Ereignisse beim AWT
Pfeil 15.5.1 Die Klasse AWTEvent
Pfeil 15.5.2 Events auf verschiedenen Ebenen
Pfeil 15.5.3 Swings Ereignisquellen und Horcher (Listener)
Pfeil 15.5.4 Listener implementieren
Pfeil 15.5.5 Listener bei dem Ereignisauslöser anmelden/abmelden
Pfeil 15.5.6 Aufrufen der Listener im AWT-Event-Thread
Pfeil 15.5.7 Adapterklassen nutzen
Pfeil 15.5.8 Innere Mitgliedsklassen und innere anonyme Klassen
Pfeil 15.6 Schaltflächen
Pfeil 15.6.1 Normale Schaltflächen (JButton)
Pfeil 15.6.2 Der aufmerksame ActionListener
Pfeil 15.6.3 Basisklasse AbstractButton
Pfeil 15.6.4 Wechselknopf (JToggleButton)
Pfeil 15.7 Swing Action
Pfeil 15.7.1 javax.swing.Action
Pfeil 15.7.2 Eigenschaften der Action-Objekte
Pfeil 15.8 JComponent und Component als Basis aller Komponenten
Pfeil 15.8.1 Tooltips
Pfeil 15.8.2 Rahmen (Border)
Pfeil 15.8.3 Fokus und Navigation
Pfeil 15.8.4 Ereignisse jeder Komponente
Pfeil 15.8.5 Die Größe und Position einer Komponente
Pfeil 15.8.6 Komponenten-Ereignisse
Pfeil 15.8.7 Hinzufügen von Komponenten
Pfeil 15.8.8 UI-Delegate – der wahre Zeichner
Pfeil 15.8.9 Undurchsichtige (opak) Komponente
Pfeil 15.8.10 Properties und Listener für Änderungen
Pfeil 15.8.11 Swing-Beschriftungen eine andere Sprache geben
Pfeil 15.9 Container
Pfeil 15.9.1 Standardcontainer (JPanel)
Pfeil 15.9.2 Bereich mit automatischen Rollbalken (JScrollPane)
Pfeil 15.9.3 Reiter (JTabbedPane)
Pfeil 15.9.4 Teilung-Komponente (JSplitPane)
Pfeil 15.10 Alles Auslegungssache: die Layoutmanager
Pfeil 15.10.1 Übersicht über Layoutmanager
Pfeil 15.10.2 Zuweisen eines Layoutmanagers
Pfeil 15.10.3 Im Fluss mit FlowLayout
Pfeil 15.10.4 Mit BorderLayout in allen Himmelsrichtungen
Pfeil 15.10.5 Rasteranordnung mit GridLayout
Pfeil 15.10.6 Der GridBagLayout-Manager
Pfeil 15.10.7 Null-Layout
Pfeil 15.10.8 BoxLayout
Pfeil 15.10.9 Weitere Layoutmanager
Pfeil 15.11 Rollbalken und Schieberegler
Pfeil 15.11.1 Schieberegler (JSlider)
Pfeil 15.11.2 Rollbalken (JScrollBar)
Pfeil 15.12 Kontrollfelder, Optionsfelder, Kontrollfeldgruppen
Pfeil 15.12.1 Kontrollfelder (JCheckBox)
Pfeil 15.12.2 ItemSelectable, ItemListener und das ItemEvent
Pfeil 15.12.3 Sich gegenseitig ausschließende Optionen (JRadioButton)
Pfeil 15.13 Fortschritte bei Operationen überwachen
Pfeil 15.13.1 Fortschrittsbalken (JProgressBar)
Pfeil 15.13.2 Dialog mit Fortschrittsanzeige (ProgressMonitor)
Pfeil 15.14 Menüs und Symbolleisten
Pfeil 15.14.1 Die Menüleisten und die Einträge
Pfeil 15.14.2 Menüeinträge definieren
Pfeil 15.14.3 Einträge durch Action-Objekte beschreiben
Pfeil 15.14.4 Mit der Tastatur: Mnemonics und Shortcut
Pfeil 15.14.5 Der Tastatur-Shortcut (Accelerator)
Pfeil 15.14.6 Tastenkürzel (Mnemonics)
Pfeil 15.14.7 Symbolleisten alias Toolbars
Pfeil 15.14.8 Popup-Menüs
Pfeil 15.14.9 System-Tray nutzen
Pfeil 15.15 Das Model-View-Controller-Konzept
Pfeil 15.16 Auswahlmenüs, Listen und Spinner
Pfeil 15.16.1 Auswahlmenü (JComboBox)
Pfeil 15.16.2 Zuordnung einer Taste mit einem Eintrag
Pfeil 15.16.3 Datumsauswahl
Pfeil 15.16.4 Listen (JList)
Pfeil 15.16.5 Drehfeld (JSpinner)
Pfeil 15.17 Texteingabefelder
Pfeil 15.17.1 Text in einer Eingabezeile
Pfeil 15.17.2 Die Oberklasse der Text-Komponenten (JTextComponent)
Pfeil 15.17.3 Geschützte Eingaben (JPasswordField)
Pfeil 15.17.4 Validierende Eingabefelder (JFormattedTextField)
Pfeil 15.17.5 Einfache mehrzeilige Textfelder (JTextArea)
Pfeil 15.17.6 Editor-Klasse (JEditorPane)
Pfeil 15.18 Tabellen (JTable)
Pfeil 15.18.1 Ein eigenes Tabellen-Model
Pfeil 15.18.2 Basisklasse für eigene Modelle (AbstractTableModel)
Pfeil 15.18.3 Vorgefertigtes Standard-Modell (DefaultTableModel)
Pfeil 15.18.4 Ein eigener Renderer für Tabellen
Pfeil 15.18.5 Zell-Editoren
Pfeil 15.18.6 Größe und Umrandung der Zellen
Pfeil 15.18.7 Spalteninformationen
Pfeil 15.18.8 Tabellenkopf von Swing-Tabellen
Pfeil 15.18.9 Selektionen einer Tabelle
Pfeil 15.18.10 Automatisches Sortieren und Filtern mit RowSorter
Pfeil 15.18.11 Ein professionelles Tabellenlayout mit JGrid
Pfeil 15.19 Bäume (JTree)
Pfeil 15.19.1 JTree und sein TreeModel und TreeNode
Pfeil 15.19.2 Selektionen bemerken
Pfeil 15.19.3 Das TreeModel von JTree
Pfeil 15.20 JRootPane, JLayeredPane und JDesktopPane
Pfeil 15.20.1 Wurzelkomponente der Top-Level-Komponenten (JRootPane)
Pfeil 15.20.2 JLayeredPane
Pfeil 15.20.3 JDesktopPane und die Kinder JInternalFrame
Pfeil 15.21 Dialoge und Window-Objekte
Pfeil 15.21.1 JWindow und JDialog
Pfeil 15.21.2 Modal oder nicht-modal
Pfeil 15.21.3 Standarddialoge mit JOptionPane
Pfeil 15.21.4 Der Farbauswahldialog JColorChooser
Pfeil 15.21.5 Der Dateiauswahldialog
Pfeil 15.22 Flexibles Java-Look
Pfeil 15.22.1 L & F global setzen
Pfeil 15.22.2 UIManager
Pfeil 15.22.3 Verbessern des Aussehens unter Windows mit JGoodies Looks
Pfeil 15.23 Die Zwischenablage (Clipboard)
Pfeil 15.23.1 Clipboard-Objekte
Pfeil 15.23.2 Auf den Inhalt zugreifen mit Transferable
Pfeil 15.23.3 DataFlavor ist das Format der Daten in der Zwischenablage
Pfeil 15.23.4 Einfügungen in der Zwischenablage erkennen
Pfeil 15.23.5 Drag
Pfeil 15.24 Undo durchführen
Pfeil 15.25 AWT, Swing und die Threads
Pfeil 15.25.1 Ereignisschlange (EventQueue) und AWT-Event-Thread
Pfeil 15.25.2 Swing ist nicht Thread-sicher
Pfeil 15.25.3 Swing-Elemente mit invokeLater() und invokeAndWait() bedienen
Pfeil 15.25.4 SwingWorker
Pfeil 15.25.5 Eigene Ereignisse in die Queue setzen
Pfeil 15.25.6 Auf alle Ereignisse hören
Pfeil 15.26 Barrierefreiheit mit der Java Accessibility API
Pfeil 15.27 Benutzerinteraktionen automatisieren
Pfeil 15.27.1 Automatisch in die Tasten hauen
Pfeil 15.27.2 Mausoperationen
Pfeil 15.27.3 Methoden zur Zeitsteuerung
Pfeil 15.27.4 Screenshots
Pfeil 15.27.5 MouseInfo und PointerInfo
Pfeil 15.28 Zeitliches Ausführen mit dem javax.swing.Timer
Pfeil 15.29 Alternativen zu AWT und Swing
Pfeil 15.29.1 XML-Beschreibungen der Oberfläche: Swixml, XUL/Luxor
Pfeil 15.29.2 SWT (Standard Widget Toolkit)
Pfeil 15.30 Zum Weiterlesen


Galileo Computing - Zum Seitenanfang

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


Galileo Computing - Zum Seitenanfang

15.16.1 Auswahlmenü (JComboBox) Zur nächsten ÜberschriftZur vorigen Ü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(). 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(). Mit addItem() lassen sich Elemente dem assoziierten ComboBoxModel hinzufügen, mit removeItem() wieder entfernen, und getItemAt(index) erfragt ein Element. Das aktuell ausgewählte Element erfahren wir mit getSelectedItem() und den Index mit getSelectedIndex().

Abbildung 15.17 Beispiel 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 15.40 com/tutego/insel/ui/list/JComboBoxDemo.java

package com.tutego.insel.ui.list; 
 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
 
public class JComboBoxDemo 
{ 
  public static void main( String[] args ) 
  { 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 
 
    String[] lang = { 
      "Patronengurt", "Hausnummer", "Schmetterling", "Sphinx", "Anbetung", 
      "Ende" 
    }; 
 
    // First JComboBox 
 
    JComboBox combo1 = new JComboBox(); 
 
    for ( String s : lang ) 
      combo1.addItem( s ); 
 
    frame.add( combo1, BorderLayout.LINE_START ); 
 
    combo1.addActionListener( new ActionListener() { 
      public void actionPerformed( ActionEvent e ) 
      { 
        System.out.println( e ); 
        JComboBox selectedChoice = (JComboBox) e.getSource(); 
        if ( selectedChoice.getSelectedItem().equals( "Ende" ) ) 
          System.exit( 0 ); 
      } 
    } ); 
 
    // Second JComboBox 
 
    JComboBox 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 
extends JComponent 
implements ItemSelectable, ListDataListener, ActionListener, Accessible

  • JComboBox() Erzeugt ein leeres Auswahlmenü mit einem Standardmodel.
  • JComboBox( Object[] 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 aModel ) Erzeugt ein Auswahlmenü mit einem Combo-Box-Model, das die Daten speichert.

Zur Selektion beziehungsweise Abfrage selektierter Elemente bietet die Klasse weitere Funktionen 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.

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


class javax.swing.JComboBox 
extends JComponent 
implements ItemSelectable, ListDataListener, ActionListener, Accessible

  • void addItem( Object anObject ) Fügt dem Model einen Eintrag hinzu.
  • Object 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( Object anObject, 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 ComboBox-Model insbesondere ein MutableComboBoxModel ist.

Ereignisse der JComboBox

Die JComboBox löst bei der Selektion zwei Arten von Ereignissen aus: ActionEvents und Item Events. Seit Java 1.4 lässt sich auch ein PopupMenuListener hinzufügen. Zum 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 eins für die Selektion. Geht der Benutzer etwa mit der Cursor-Taste durch die Liste, rasselt es an Ereignissen.

class javax.swing.JComboBox 
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 tätigte, wird ebenfalls der ActionListener informiert. Dann lässt sich jedoch nicht mehr direkt der Ursprung des ActionEvents ersehen. Standardmäßig bleibt die Selektion unverändert, und insbesondere wird das Element nicht automatisch in das Model übertragen.


Galileo Computing - Zum Seitenanfang

15.16.2 Zuordnung einer Taste mit einem Eintrag Zur nächsten ÜberschriftZur vorigen Überschrift

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 15.41 com/tutego/insel/ui/list/JComboBoxKeySelection.java

package com.tutego.insel.ui.list; 
 
import javax.swing.*; 
 
class JComboBoxKeySelection 
{ 
  public static void main( String[] args ) 
  { 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 
 
    JComboBox cb = new JComboBox( "A,B,C".split(",") ); 
 
    cb.setKeySelectionManager( new JComboBox.KeySelectionManager() 
    { 
      public int selectionForKey( char aKey, ComboBoxModel aModel ) 
      { 
 
        int pos = Math.abs( aKey – 1 – '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.


Galileo Computing - Zum Seitenanfang

15.16.3 Datumsauswahl Zur nächsten ÜberschriftZur vorigen Überschrift

Einen Dialog oder eine Komponente zur Auswahl eines Datums liefert Java nicht aus. Auf dem freien Markt gibt es allerdings einige Komponenten, die das nachliefern. Unter ihnen sind:

  • DateComboBox von Rob MacGrogan bietet eine Combo-Box für Datumseingaben. Die freie Bibliothek unter http://pswing.sourceforge.net/ blendet neben einem Textfeld eine Schaltfläche zur Datumsauswahl an.

Galileo Computing - Zum Seitenanfang

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

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


Beispiel Beispiel Erzeuge eine JList mit einigen Zeichenketten:

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

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


class javax.swing.JList 
extends JComponent 
implements Scrollable, Accessible

  • JList() Erzeugt eine neue leere List-Box.
  • JList( Object[] listData )
  • JList( Vector listData ) Erzeugt eine Liste mit Daten, die dem Feld oder dem Vektor entstammen.

Ein einfaches Listen-Model

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

Ein Standard-Listenmodell, welches von der API dem java.util.Vector zum Verwechseln ähnlich sieht, ist das DefaultListModel; Elemente lassen sich zu diesem Model einfach mit addElement()hinzufügen.


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


Listing 15.42 com/tutego/insel/ui/list/JListDemo.java

package com.tutego.insel.ui.list; 
 
import javax.swing.*; 
import javax.swing.event.*; 
 
public class JListDemo 
{ 
  public static void main( String[] args ) 
  { 
    JFrame frame = new JFrame( "Levels of Happiness" ); 
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 
 
    final DefaultListModel 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 l = new JList( lykkeligModel ); 
 
    l.addListSelectionListener( new ListSelectionListener() { 
      public void valueChanged( ListSelectionEvent e ) { 
        if ( e.getValueIsAdjusting() ) 
          return; 
 
        System.out.println( e ); 
 
        if ( lykkeligModel.get( e.getLastIndex() ).equals( "Ende" ) ) 
          System.exit( 0 ); 
      } 
    } ); 
 
    frame.add( new JScrollPane(l) ); 
    frame.pack(); 
    frame.setVisible( true ); 
  } 
}

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


class javax.swing.JList 
extends JComponent 
implements Scrollable, Accessible

  • JList( ListModel dataModel ) Erzeugt die Liste mit einem spezifischen Model.
  • Da das Model die Daten beinhaltet, fehlen der JList-Komponente die Modifikationsfunktionen.

Einen Eintrag selektieren

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

  • SINGLE_SELECTION. Nur ein Element darf zur gleichen Zeit selektiert sein.
  • MULTIPLE_INTERVAL_SELECTION. Eine zusammenhängende Gruppe von Elementen dürfen selektiert sein.
  • SINGLE_INTERVAL_SELECTION. Auch nicht zusammenhängende Elemente können selektiert sein.

Eine neue Selektionsart weist der JList die Methode setSelectionMode(int selectionMode) zu, der eine der drei genannten Konstanten übergeben wird.

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


class javax.swing.event.ListSelectionEvent 
extends EventObject

  • int getFirstIndex()
  • int getLastIndex()
  • boolean getValueIsAdjusting()

Die Methoden haben wir im Beispielprogramm schon genutzt.

Außer im Ereignislistener 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 
extends JComponent 
implements Scrollable, Accessible

  • void clearSelection() Löscht vorgenommene Selektionen.
  • int getSelectedIndex() Liefert die Position des selektierten Eintrags und –1, wenn kein Element gewählt wurde.
  • int[] getSelectedIndices() Liefert die Positionen aller selektierten Einträge.
  • Object getSelectedValue() Liefert den gewählten Wert oder null.
  • Object[] getSelectedValues() Liefert alle gewählten Werte.
  • void setSelectionMode( int selectionMode ) Setzt den Selektionsmodus. Das Argument kann die Werte ListSelection-Model.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.
  • void ensureIndexIsVisible( int index ) Bewegt die Liste in einem Ausschnitt, sodass der Eintrag an der Stelle index sichtbar ist.
  • void addListSelectionListener( ListSelectionListener listener ) Fügt einen Listener hinzu.
  • void removeListSelectionListener( ListSelectionListener listener ) Entfernt den Listener.

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 15.43 com/tutego/insel/ui/list/JListAddElementsDemo.java

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

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

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 add-Element() in das DefaultListModel.

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

Renderer

Aufgabe eines Renderes ist es, die Elemente darzustellen. Standardmäßig nutzt die JList einen speziellen JLabel zur Darstellung, welcher die toString()-Funktion 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 an dieses Objekt.

Ein Render-Beispiel gibt das Unterkapitel bei Tabellen und auch die API-Dokumentation zeigt bei ListCellRenderer ein einfaches Beispiel.


Galileo Computing - Zum Seitenanfang

15.16.5 Drehfeld (JSpinner) topZur vorigen Ü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 eine Liste von Auswahlelementen wird 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 Zugriff auf die Elemente ermöglicht. Ein SpinnerModel wird im Konstruktor von JSpinner gesetzt oder über setModel().

SpinnerListModel

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


Beispiel 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 Anfragemethoden, um das gewählte Datum abzufragen.


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

Listing 15.44 com/tutego/insel/ui/swing/JSpinnerDemo.java

package com.tutego.insel.ui.swing; 
 
import javax.swing.*; 
 
public class JSpinnerDemo 
{ 
  public static void main( String[] args ) 
  { 
    JFrame f = new JFrame(); 
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 
 
    f.setLayout( new BoxLayout(f.getContentPane(), BoxLayout.Y_AXIS) ); 
 
    // Nummern-Spinner für Werte von 1 bis 10, in 0,2er Schritten 
    SpinnerNumberModel model1 = new SpinnerNumberModel( 5.0, 0.0, 10.0, 0.2 ); 
    JSpinner spin1 = new JSpinner( model1 ); 
 
    f.add( spin1 ); 
 
    // Spinner mit einem SpinnerListModel mit Komikern 
 
    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 ); 
  } 
}


Ihr Kommentar

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






<< zurück



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


[Galileo Computing]

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