如何绑定不同FXML中两个文本字段的文本属性

时间:2014-02-15 08:23:44

标签: javafx javafx-2 javafx-8

我已经完成了类似的question,但它使用了Singleton Class。我发现的其他类似问题主要是嵌套控制器。所以我提出这个简单的问题,希望得到两个不同FXML的TextFields的绑定文本属性的答案。

我在两个不同的fxmls中有两个文本域,这些是他们的控制器类:

TextField1Controller.java

public class TextField1Controller implements Initializable{

@FXML
TextField txt1FxId;

@Override
public void initialize(URL location, ResourceBundle resources) {


}
}

TextField2Controller.java

public class TextField2Controller implements Initializable{

@FXML
TextField txt2FxId;

@Override
public void initialize(URL location, ResourceBundle resources) {

}
}

MainApp.java

public class MainApp extends Application{

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

@Override
public void start(Stage stage1) throws Exception {      
    AnchorPane pane1  = FXMLLoader.load(this.getClass().getResource("TextField1.fxml"));
    AnchorPane pane2  = FXMLLoader.load(this.getClass().getResource("TextField2.fxml"));        
    Stage stage2 = new Stage(); 
    stage1.setScene(new Scene(pane1));
    stage2.setScene(new Scene(pane2));  
    stage1.show();
    stage2.show();  

}

}

如何在MainApp.java中绑定这些文本字段的text属性,以便在另一个文本字段上打字,反之亦然?

1 个答案:

答案 0 :(得分:4)

方法是:

  • 使用实例化的FXML加载器并调用其非静态方法
  • 为相关控制器中的文本字段设置访问器并获取它们,
  • 双向绑定文本字段。

<强>实施

放入吸气剂

public TextField getTxt1FxId() {
    return txt1FxId;
}

进入TextField1Controller课程,getTxt2FxId()进入第二职业 主应用程序,

@Override
public void start(Stage stage1) throws Exception {
    FXMLLoader loader = new FXMLLoader();
    Parent pane1 = (Parent) loader.load(getClass().getResource("TextField1.fxml").openStream());
    TextField1Controller controller1 = loader.getController();

    loader = new FXMLLoader();
    Parent pane2 = (Parent) loader.load(getClass().getResource("TextField2.fxml").openStream());
    TextField2Controller controller2 = loader.getController();

    controller1.getTxt1FxId().textProperty().bindBidirectional(
                    controller2.getTxt2FxId().textProperty());

    Stage stage2 = new Stage(); 
    stage1.setScene(new Scene(pane1));
    stage2.setScene(new Scene(pane2));  
    stage1.show();
    stage2.show();  

}