Weitere aktuelle Java-Titel finden Sie bei dpunkt.
 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index


8.6.2

JComboBox



Abbildung 8.34: JComboBox
Abbildung 8.34

Eine JComboBox bietet die Möglichkeit, aus einer Liste von Daten ein Datum auszuwählen. Im Gegensatz zu einer JList, die auch über eine Mehrfachselektion verfügen kann, sieht man immer nur das eine ausgewählte Element. Eine JComboBox verfügt über ein Popup, welches man mittels Tastenkürzel oder Mausklick anzeigen lassen kann und alle Elemente zur Auswahl anbietet.

Die Größe des Popups wird dabei in der Breite durch den Renderer oder den Editor bestimmt, je nachdem, welcher von beiden die größere Breite besitzt.

Die Höhe des Popups bestimmt sich aus dem Produkt aus der Höhe des Renderers und der Anzahl der anzuzeigenden Reihen, die mittels setMaximumRowCount(int rows) gesetzt werden kann.

Neu in Version [1.4]1.4 ist die Möglichkeit, einen PopupMenuListener zu registrieren. Dadurch kann der Programmierer informiert werden, wenn das Popup sichtbar bzw. unsichtbar wird und ob die Auswahl über das Popup abgebrochen wurde (typischerweise, wenn der Benutzer neben das Popup klickt).

Hierdurch hat der Programmierer aber auch einen leichten Zugriff auf das JPopupMenu.

Model

Die angezeigten Daten können mithilfe des ComboBoxModel (eine Erweiterung vom ListModel) gesetzt werden, wobei eine Standardimplementierung über die Klasse DefaultComboBoxModel (abgeleitet von AbstractListModel) zur Verfügung steht. Über das AbstractListModel erhält der Programmierer Zugriff auf die folgenden Methoden zur Benachrichtigung der JComboBox bei Änderungen (die Quelle (source) ist in allen Fällen das Model selbst):

fireContentsChanged(Object source, int index0, int index1)Bei Veränderung eines Bereiches oder wenn sich alles geändert hat (in diesem Fall kann für beide Indizes -1 übergeben werden), wird diese Methode aufgerufen.
fireIntervalAdded(Object source, int index0, int index1)Wenn es sich bei der Änderung um ein Hinzufügen von neuen Objekten handelt, dann sollte diese Methode aufgerufen werden.
fireIntervalRemoved(Object source, int index0, int index1)Werden Datenelemente entfernt, so sollte die ComboBox mit dieser Methode benachrichtigt werden.

Möchte man das Model direkt von dem Interface ComboBoxModel ableiten, so muss man natürlich die fireXXX-Methoden selbst definieren. Bei der Zuweisung des Models zur ComboBox registriert sich diese mithilfe der Methode addListDataListener(ListDataListener l) beim Model.

Ändert sich nun das Model, so wird die JComboBox wie alle anderen Listener darüber mithilfe der Methoden des Interface javax.swing.event.ListDataListener informiert:

  protected EventListenerList listenerList = 
      new EventListenerList();

  public void addListDataListener(ListDataListener l) {
     listenerList.add(ListDataListener.class, l);
  }

  /** 
   * Diese Methode informiert die Listener, 
   * dass sich das komplette Model geändert hat
   */
  protected void fireContentsChanged() {
    ListDataEvent e = new ListDataEvent(this, 
      ListDataEvent.CONTENTS_CHANGED, -1, -1);
    EventListener[] listeners = getListeners(
                                  ListDataListener.class); 
    for (int i = 0; i > listeners.length; i++)
     ((ListDataListener) listeners[i]).contentsChanged(e);
  }

Die weiteren fireXXX-Methoden sollten äquivalent dazu geschrieben werden.

Renderer

Der Renderer bei der JComboBox ist der gleiche wie bei einer JList. Die Standardimplementierung ist die Klasse DefaultListCellRenderer, welche von JLabel abgeleitet ist.

Falls das anzuzeigende Datum ein Exemplar von Icon ist, wird diese Grafik mittels setIcon(Icon icon) der Klasse JLabel angezeigt. Ein null-Wert wird mit einem Leerstring angezeigt. Bei allen anderen Objekten wird der Rückgabewert der methode toString() mittels setText(String) zur Anzeige gebracht.

Editor

Der Editor (ComboBoxEditor) ist typischerweise ein JTextField, bei dem der zu editierende Wert mittels der toString()-Methode angezeigt und verändert werden kann. Die Übernahme geschieht dabei durch eine Return-Eingabe. Dementsprechend registriert sich die ComboBox als ActionListener bei dem Editor. Die Reihenfolge eines Editiervorgangs ist dementsprechend:

Beispiel

  JComboBox cb = JComboBox(new Object[] { 
    new ImageIcon("apfel.gif"), 
    new ImageIcon("kuerbis.gif"), 
    new ImageIcon("paprika.gif")});
  getContentPane ().add(cb);
  cb = new javax.swing.JComboBox (
    new Object[] {"Apfel", "Kürbis", "Paprika"});
  getContentPane ().add(cb);


 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index

Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.