# KeyListener bei editierbarer JComboBox



## Florian Scheidler (4. Jan 2006)

Hallo zusammen,

für meine Java-Anwendung gibt es eine Datenbank mit Lieferanten. In der Anwendung kann der Benutzer die Lieferanten nun aus einer JComboBox auswählen. Da es eine Menge Lieferanten gibt, würde ich dem Benutzer gerne die Möglichkeit geben, direkt in die JComboBox ein Stichwort einzutragen und den passenden Kunden automatisch zu finden. Die JComboBox habe ich als mit setEditible(true) als editierbar gekennzeichnet.
Zudem weise ich der JComboBox einen KeyListener zu, der beim Eintragen von Buchstaben über die Tastatur, immer wieder prüft ob ein Lieferant mit diesem Stichwort vorhanden ist.
Leider passiert beim Eintippen in die ComboBox gar nichts, der KeyListener scheint nicht zu greifen:


```
cmbLieferant.setEditable(true);
cmbLieferant.addKeyListener( new KeyListener ()
{
    public void keyPressed( KeyEvent e ) 
    {
      System.out.println("KeyPressed");
      JComboBox selectedChoice = (JComboBox)e.getSource();
      System.out.println(selectedChoice.getName());
      try
      {
        System.out.println("SelItem:" + selectedChoice.getSelectedItem().toString());
        Statement stmtSuche = co.createStatement();
        //SQL-Suche in DB nach Lieferant zum eingetragenen Stichwort        
           			
       if (rsetSuche.next() != false)
       {
         System.out.println("Er hat 1 gefunden!");
         selectedChoice.setSelectedItem(rsetSuche.getString(2) + ", " + rsetSuche.getString(7));
           			}
               			
       }
       catch (SQLException ex) 
       {
         System.err.println("SQLException : " + ex.getMessage());
         ex.printStackTrace();
       }
	    		
    }
	    	
    public void keyReleased( KeyEvent e ) 
    {
	System.out.println("KeyReleased");
    		
    }
	    	
    public void keyTyped( KeyEvent e ) 
    {
	System.out.println("KeyTyped");
          		
              		
	    		
    }
	    	
}
);
```

Selbst die Ausgaben "KeyPressed", "KeyReleased" und "KeyTyped" werden nicht ausgegeben.

Kann mir jemand sagen, warum bei der Eingabe von Tasten in eine editierbare ComboBox das KeyEvent nicht greift???

Gruß Florian Scheidler


----------



## Beni (4. Jan 2006)

Die Selektion der ComboBox wird nicht direkt von der ComboBox dargestellt. Es wird eine zusätzliche Component, der sog. ComboBoxEditor, verwendet. Bei diesem Editor solltest du den KeyListener registrieren (oder du kannst auch eine eigene Component verwenden, dann wirds vielleicht noch einfacher).

An den Editor kommst du über die Methode "getEditor()"


----------



## Florian Scheidler (5. Jan 2006)

Zunächst einmal Danke für die Hilfe. Immerhin funktioniert nun der KeyListener, da ich nun per

cmbLieferant.getEditor().getEditorComponent().addKeyListener( new KeyListener ()
....

den KeyListener beim Editor registriert habe. Nun habe ich allerdings im KeyEvent KeyPressed Probleme die JComboBox-Componente zu erfragen. Scheinbar wird mir ein Object der Klasse BasicComboBoxEditor zurückgegeben, wenn ich e.getSource() benutze. Also versuchte ich folgendes:

BasicComboBoxEditor editor = (BasicComboBoxEditor)e.getSource();
JComboBox selectedChoice = (JComboBox)editor.getEditorComponent();

Leider schmeist mir Java dann eine ClassCastExeption in der oberen Zeile. Scheinbar kann Java also das mit getSource zurückgegebene Objekt nicht auf BasicComboBoxEditor casten, obwohl es eindeutig ein solches ist.

Kann mit jemand sagen, wie ich bei diesem KeyEvent die JComboBox zurückgegeben bekomme?

P.S.: Ich benötige die JComboBox um das eingegebene Stichwort per getSelectedItem() zu bekommen und den zum Stichwort passenden Lieferanten per setSelectedItem() auszuwählen.

Gruß Florian Scheidler


----------



## Beni (5. Jan 2006)

Ich würde ein eigene Klasse für den Listener machen. Dann kannst du die ComboBox im vorraus als Instanzvariable speichern (am einfachsten: im Konstruktor übergeben, und der Listener registriert sich dann auch gleich selbst beim Editor).
Jeder Versuch über das KeyEvent an die ComboBox zu kommen, kann nur im Chaos enden (du kannst dir nichtmal sicher sein, dass jedesmal derselbe Typ Editor verwendet wird).


----------

