2016-08-16 9 views
0

Ich baue eine einfache editierbare ComboBox mit Auto-Vervollständigung. Ich möchte den Inhalt meiner ComboBox abhängig vom Inhalt des inneren TextFields filtern.
Ich habe es geschafft, es funktioniert, aber ich habe ein Problem, wenn es darum geht, die Auto-Vervollständigen-Logik erneut anzuwenden, wenn Sie ein Zeichen aus dem TextField löschen.JavaFX ComboBox TextField Inhalt bei Schlüsselereignis

Von dem, was ich gesehen habe, enthält der Inhalt des Textfelds nach dem Tastendruck noch nicht das hinzugefügte Zeichen.
Also habe ich nur eine einfache Logik gemacht, um die String-Version des KeyEvent hinzuzufügen, um den Inhalt des TextField zu simulieren. Ich habe dieses beacuse Ich brauche den vollständigen Text haben, meine Logik
Grundsätzlich anwenden:

// In constructor 
cmb.getEditor().setOnKeyPressed(this::handleOnKeyPressed); 

public void handleOnKeyPressed(KeyEvent e) { 
    String text = comboBox.getEditor().getText() + e.getText(); 
    // Filtering logic based on text 
} 

Das funktioniert gut, wenn einige Zeichen eingeben, aber wenn die Rücktaste drücken oder löschen Tasten, es nicht funktioniert (was offensichtlich nach dem Code).
Also die Lösung, die ich sehen würde, wäre, die Caret-Position zu überprüfen und die Rücktaste zu simulieren/löschen Zeichen entfernen auf der Grundlage der Caret-Position. Aber das ist ziemlich umständlich ...
Daher frage ich mich, ob es keinen anderen Weg gibt, dies zu tun? Ist es möglich, den vollständigen Text direkt zu erhalten? Am Anfang dachte ich über das Hinzufügen eines Change-Listeners, aber scheint nicht möglich mit dem TextField.

Irgendwelche Ideen?
Danke!

+0

Sie einen Zuhörer zum 'Textproperty hinzufügen können()' von das TextField. – ItachiUchiha

+0

Ja, in der Tat, Antwort validiert unten! – Xendar

Antwort

1

Sie können eine ChangeListener<String> zum textProperty des Editors hinzufügen, die jedes Mal, wenn der Text innerhalb des Editorfeld geändert wird ausgelöst werden:

cmb.getEditor().textProperty().addListener(this::handleComboTextChange); 

... 

public void handleComboTextChange(ObservableValue<? extends String> o, String oldText, String newText) { 
    ... 
} 
+0

Oh mein Gott, ich fühle mich so dumm ... Natürlich müssen Sie durch die Text-Eigenschaft für den Hörer gehen ... Danke! – Xendar