Zuerst ändern Sie Ihre WordType
Klasse JavaFX Eigenschaften zu verwenden:
public class WordType {
private final StringProperty first = new SimpleStringProperty();
private final StringProperty second = new SimpleStringProperty();
public StringProperty firstProperty() {
return first ;
}
public final String getFirst() {
return firstProperty().get() ;
}
public final void setFirst(String first) {
firstProperty().set(first);
}
public StringProperty secondProperty() {
return second ;
}
public final String getSecond() {
return secondProperty().get() ;
}
public final void setSecond(String second) {
secondProperty().set(second);
}
}
nun die Liste Zelle Implementierung ändern, damit es die Textfelder nur einmal erstellt. Wenn die Option wechselt, in zwei Richtungen die Textfelder, um die Eigenschaften in der neuen Sache binden:
list.setCellFactory(lv -> new ListCell<WordType>() {
private final TextField word = new TextField();
private final TextField translate = new TextField();
private final ToolBar root = new ToolBar(word, new Separator(), translate);
{
// anonymous constructor:
itemProperty().addListener((obs, oldWordType, newWordType) -> {
if (oldWordType != null) {
word.textProperty().unbindBidirectional(oldWordType.firstProperty());
translate.textProperty().unbindBidirectional(oldWordType.secondProperty());
}
if (newWordType != null) {
word.textProperty().bindBidirectional(newWordType.firstProperty());
translate.textProperty().bindBidirectional(newWordType.secondProperty());
}
});
}
@Override
protected void updateItem(WordType item, boolean empty) {
super.updateItem(item, empty);
setGraphic(empty ? null : root);
}
});
Wenn aus irgendeinem Grund sind Sie nicht in der Lage, die Umsetzung von WordType
zu ändern, dann können Sie einige Zuhörer auf die Textfelder verwenden, anstatt . Beachten Sie, dass dies nur in einer Richtung funktioniert: Wenn sich der Text im Textfeld ändert, ändert sich die Eigenschaft WordType
; Wenn sich die WordType
Eigenschaft jedoch von einer anderen Quelle ändert, während die Zelle angezeigt wird, wird die Zelle nicht aktualisiert. Abhängig von Ihren Anwendungsanforderungen kann dies ein Problem sein oder auch nicht. Die Zelle Implementierung in diesem Fall wie folgt aussieht:
list.setCellFactory(lv -> new ListCell<WordType>() {
private final TextField word = new TextField();
private final TextField translate = new TextField();
private final ToolBar root = new ToolBar(word, new Separator(), translate);
{
// anonymous constructor:
word.textProperty().addListener((obs, oldText, newText) -> {
WordType wordType = getItem();
wordType.setFirst(newText);
});
translate.textProperty().addListener((obs, oldText, newText) -> {
WordType wordType = getItem();
wordType.setSecond(newText);
});
}
@Override
protected void updateItem(WordType item, boolean empty) {
super.updateItem(item, empty);
setGraphic(empty ? null : root);
}
});
mit Ihrer vorhandenen WordType
Klasse (ich nehme an, Sie die get
und set
Methoden der Kürze halber weggelassen).
Können Sie die 'WordType'-Klasse ändern, um JavaFX-Eigenschaften zu verwenden? –
Nein, kann ich nicht. Ich lade Wörter aus einigen Ressourcen und ich muss meine Worte in diesen Ressourcen umschreiben. –
Ich verstehe nicht, warum das Sie daran hindern würde, die Klassenimplementierung zu ändern, obwohl ...? –