2016-11-03 2 views
2

Ich habe einige Wörter, die ich in TextField anzeigen. Ich möchte diese Wörter jedes Mal neu schreiben, wenn diese Wörter in TextField geändert wurden. Das ist meine Art:Wie binden Sie TextField und String-Objekt in JavaFX?

class WordType { 
    String first; 
    String second; 
} 

und Listview, wo ich meine Worte zeigen:

ListView<WordType> list = new ListView<>(); 

list.setCellFactory(lv -> new ListCell<WordType>() { 
     @Override 
     public void updateItem(WordType item, boolean empty){ 
      super.updateItem(item, empty); 
      if (empty){ 
       setText(null); 
      } else { 
       ToolBar root = new ToolBar(); 

       TextField word = new TextField(item.first); 

       TextField translate = new TextField(item.second); 

       root.getItems().addAll(word, new Separator(), translate); 
       setGraphic(root); 
      } 
     } 
    }); 

Wie ändern Strings in WordType wenn ich diese Strings in TextField- ändern?

Sorry, für mein schlechtes Englisch =)

+0

Können Sie die 'WordType'-Klasse ändern, um JavaFX-Eigenschaften zu verwenden? –

+0

Nein, kann ich nicht. Ich lade Wörter aus einigen Ressourcen und ich muss meine Worte in diesen Ressourcen umschreiben. –

+0

Ich verstehe nicht, warum das Sie daran hindern würde, die Klassenimplementierung zu ändern, obwohl ...? –

Antwort

2

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).

Verwandte Themen