# Komisches Verhalten: JCombobox mit KeyListener



## MaikHSW (6. Feb 2010)

Hey zusammen.
Wie in meinem anderen Thread beschrieben bin ich gerade dabei,
einen EventListener für ein Auto-Vervollständigen zu implementieren.
Dabei bin ich jedoch über ein, für mich Phänomen, gestolpert.
Wenn ich die Combobox auf editable(true) stelle klappt es nicht.
Stelle ich sie auf false reagiert mein Listener wunderbar.
Ein ähnliches Verhalten wir in dem Thread http://www.java-forum.org/awt-swing-swt/17619-jcombobox-listener-binden.html beschrieben, jedoch nicht aufgelöst.
Könnt ihr mir das hier erklären warum dies passiert und wie man es lösen kann?

Auf Wunsch stelle ich gerne noch die entsprechende Klasse online, jedoch habe ich davon abgesehen da diese etwas größer ist.

Danke für eure Mühe.


Gruß


----------



## Gast2 (7. Feb 2010)

Ja weil das Event bestimmt in der Combobox irgendwann consumed wird...

EDIT: Muss eventuell einen eigenen ComboboxEditor schreiben...

EDIT EDIT: Oder du machst sowas

```
JTextField field = (JTextField) box.getEditor().getEditorComponent();
		field.getDocument().addDocumentListener(new DocumentListener() {
			
			@Override
			public void removeUpdate(DocumentEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void insertUpdate(DocumentEvent e) {
				System.out.println(e);
				
			}
			
			@Override
			public void changedUpdate(DocumentEvent e) {
				// TODO Auto-generated method stub
				
			}
		});
```


----------



## MaikHSW (7. Feb 2010)

Hey Wayne.
Einen eigenen ComboboxEditor? Warum dies?
Das mit dem consumed verstehe ich nicht so recht.

De Lösung mit dem JTextField kenne ich bereits, allerdings hat die für mich folgende Nachteile:
Der Kunde kriegt nicht direkt eine Übersicht der möglichen Namen (Meier, Meierschule, Meiermüller) sondern müsste deutlich mehr schreiben.
Dies könnte ich nur umgehen indem ich ein JTable Objekt laufend neu befüllen lasse.
Allerdings führt das wieder meine AutoVervollständigen Idee ad absurdum.
Somit ist das eigentlich keine praktikable Lösung.

Es muss ja auch mit der Combobox lösbar sein, denn wenn editable auf false steht klappt es ja.
Also muss es dort irgendwo eine Differenz geben die man sicher umgehen bzw. lösen kann.
Aber mein Java Wissen reicht für dieses Verständnis leider nicht aus.

Dennoch erstmal danke für deine Antwort.


Gruß


----------



## Gast2 (7. Feb 2010)

Der Combobox Editor macht eben mit dem Event schon was... Und wenn er das Event consumed wirst du es nicht mehr erhalten...


----------



## MaikHSW (7. Feb 2010)

Hey.
Okay, durch die Änderung dieser Option scheint sie es zu nutzen.
Ja, aber dennoch muss es doch eine Möglichkeit geben dies zu umgehen, oder?
Sonst bliebe wirklich nur der Ansatz eines Textfeldes in Kombination mit einer Tabelle die laufend aktualisiert wird.
Das geht aber wieder an meine Performance und war so auch nicht vorgesehen....


Gruß


----------



## Gast2 (7. Feb 2010)

Wie gesagt du kannst schauen wo das Event consumed wird(debuggen), einen eigenen Editor schreiben, oder die Variante von oben. Was gegen die spricht hab ich nicht verstanden. Oder du versuchst auf dem Textfeld mal den KeyListener zu registieren, aber das der DocumentListener macht eigentlich seine Aufgabe...


----------



## MaikHSW (7. Feb 2010)

Hey.
Danke für deine Antwort.
Also so weit reichen meine Debuggingkenntnissse nicht als das ich das debuggen könnte und wüßte wo es passiert.
Vermutlich wird es ja in der Ursprungsklasse consumed,
und die ist ja Java.
Also, was dagegen spricht ist folgendes:
Der Kunde hat eigene Kunden.
Dort hat er Anja Müller, Antje Müller, Anna Müllerhuse, Annika Müllermeier und so weiter.
Nun hat er den Fall das er nicht genau weiß, wie der Kunde heißt.
Irgendwas mit Mül fällt ihm ein.
Daher möchte er Mül eingeben und eine Übersicht der Kunden die damit beginnen.
Verstehst du nun was ich meine?
Daher muss ich mehrere zur Auswahl haben und nicht nur die AutoVervollständigen Funktion.
Ein eigener Editor ist für den Zweck wohl etwas oversized.
Verstehst du was ich meine?
Hast du weitere Ideen das umzusetzen?


Gruß



Maik


----------



## Gast2 (7. Feb 2010)

Ich weiß was eine Autovervollständigung ist...
Aber jedes mal wenn er ein Buchstabe eingibt nimmst du einfach des was drin steht und suchst halt nach allen diesen Namen. Versteh dein Problem nicht! Das kannst du genau in dem DocumentListener machen.
Und warum soll ein eigener Editor oversized sein??? 
Man wächst mit seinen Aufgaben ... Durch debuggen lernt man schau einfach welches die Ursprungklasse ist und schau sie dir an. Wenn du sowas wie eine Autovervollständigung machen willst solltest du auch rausfinden was mit dem Event passiert...


----------



## sibianu (9. Feb 2010)

Warum die Mühe machen, das gibts schon im swingx, heisst AutoCompleteDecorator. 
Dann einfach: 
	
	
	
	





```
AutoCompleteDecorator.decorate(comboBox);
```
 und fertig


----------



## Gast2 (9. Feb 2010)

sibianu hat gesagt.:


> Warum die Mühe machen, das gibts schon im swingx, heisst AutoCompleteDecorator.
> Dann einfach:
> 
> 
> ...



Coole Sache kannt ich noch nicht...
Weißt du auch ob es auch geht ein JTextfeld zu nehmen und dort Autocompletion einzustellen, dass dann eine Liste unterhalb des jTextfiel dargestellt wird?


----------



## Gast2 (10. Feb 2010)

Falls jemand eine AutoCompletion in SWT sucht
AutoCompleteField (Eclipse Platform API Specification)


----------



## sibianu (15. Feb 2010)

SirWayne hat gesagt.:


> Coole Sache kannt ich noch nicht...
> Weißt du auch ob es auch geht ein JTextfeld zu nehmen und dort Autocompletion einzustellen, dass dann eine Liste unterhalb des jTextfiel dargestellt wird?



Das geht glaube ich nicht, aber man kann doch einfach den Button von der ComboBox wegmachen dann sieht das doch auch wie ein Textfield aus.


----------



## Kleopatra (19. Feb 2010)

ja, textField geht auch - nur für die Darstellung der Liste mußt Du selber sorgen. Beispiel in SwingLabs Demos zu sehen:

https://swinglabs-demos.dev.java.net/demos/swingxset6/swingxset.jnlp

CU
Jeanette


----------



## Dit (25. Feb 2010)

Hallo Zusammen, 

ich bin gerade bei der selben Sache und sehe, dass das Thema noch recht aktuell ist. 
deinen Listener hängst du wie folgt an deine ComboBox:


```
cbBeispiel.getEditor().getEditorComponent().addKeyListener(new KeyListener() {

        @Override
        public void keyTyped(KeyEvent e){
          System.out.println("keyTyped");
        }

        @Override
        public void keyReleased(KeyEvent e){
          System.out.println("KeyReleased");
        }

        @Override
        public void keyPressed(KeyEvent e){
          System.out.println("KeyPressed");
        }
      });
```

mein Problem ist jedoch, dass ich über einen Regulären Ausdruck abfrage, weil der Benutzer nur Zahlen eingeben kann. Die Meldung der JOptionPane springt auch auf, jedoch ist der falsche Buchstabe dann bereits in der ComboBox, diesen falschen Buchstaben bekomme ich nicht mehr gelöscht! Daher fand ich die Idee mit dem Document Listener ganz gut.


----------

