2012-07-03 2 views
3

Дайте очень элементарный класс (импорт разрешен в JavaFX пакеты):JavaFX двунаправленная привязка не работает с управления становится не редактируется

public class T07 extends Application implements Initializable{ 

с некоторыми полями, представляющих элементы управления, определенные в файле .fxml:

@FXML TextField text01; 

и модель данных, которая использует обертки объектов в наиболее простой форме:

public static class DataModel { 

    StringProperty first = new SimpleStringProperty(); 
    //getter 
    public String getFirst() {return first.get();} 
    //setter 
    public void setFirst(String first) {this.first.set(first);} 
    //new "property" accessor 
    public StringProperty firstProperty() {return first;} 

} 

Я стараюсь, чтобы связать пользовательский интерфейс элемент управления с моделью данных внутри Initialize:

@Override 
public void initialize(URL arg0, ResourceBundle arg1) { 

    Bindings.bindBidirectional(text01.textProperty(), dm.firstProperty()); 

} 

, но делает это так, я получаю нередактируемый контроль. комментируя строку Bindings.bindBidirectional, элемент управления становится обычно редактируемым и его ценность доступна через поле text01.

Каков недостающий ингредиент в этом связующем рецепте?

ответ

6

Двунаправленный Пример связывания:

import javafx.application.Application; 
import javafx.beans.binding.Bindings; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

public class JavaFXApplication10 extends Application { 

    private Model model = new Model(); 

    @Override 
    public void start(Stage primaryStage) { 

     final TextField textField = new TextField(); 

     Bindings.bindBidirectional(textField.textProperty(), model.firstProperty()); 

     // Track the changes 
     model.firstProperty().addListener(new ChangeListener<String>() { 
      @Override 
      public void changed(ObservableValue<? extends String> arg0, String arg1, String arg2) { 
       System.out.println("model old val: " + arg1); 
       System.out.println("model new val: " + arg2); 
       System.out.println(); 
      } 
     }); 

     textField.textProperty().addListener(new ChangeListener<String>() { 
      @Override 
      public void changed(ObservableValue<? extends String> arg0, String arg1, String arg2) { 
       System.out.println("textField old val: " + arg1); 
       System.out.println("textField new val: " + arg2); 
       System.out.println(); 
      } 
     }); 

     Button btn = new Button(); 
     btn.setText("Change the model's text"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       model.setFirst("changed from button action"); 
       System.out.println("Done."); 
      } 
     }); 

     BorderPane root = new BorderPane(); 
     root.setTop(textField); 
     root.setBottom(btn); 
     primaryStage.setScene(new Scene(root, 300, 250)); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

    // Data Model 
    public static class Model { 

     StringProperty first = new SimpleStringProperty(); 
     //getter 

     public String getFirst() { 
      return first.get(); 
     } 
     //setter 

     public void setFirst(String first) { 
      this.first.set(first); 
     } 
     //new "property" accessor 

     public StringProperty firstProperty() { 
      return first; 
     } 
    } 
} 

Двунаправленного связывание:
1 способ - текст, введенный в текстовое поле будет отражен в первую StringProperty модели.
2-й противоположный путь. Нажав кнопку, вы заметите, что при установке первого stringProperty модели текстовое значение текстового поля также будет изменено.

+1

Если посмотреть на код в вопросе, я не вижу, что делает этот код, который функционально отличается. Я просто вижу код, который отслеживает, что происходит. Что это исправляет? – Joel

+1

@Joel. Это означает, что «вот рабочий пример без поведения« не редактируемого управления », поэтому вы должны снова посмотреть свой код». –

Смежные вопросы