3

我有一个带有多个控件的 JavaFX 用户界面;这些值应该存储在 Model 类的字段中;UI 类有对 Model 的引用。

说 Model 类是基本的:

public static class Model{String myText; /*javabeans getters and setters provided too*/}

JavaFX 应用程序如下。

public class T08 extends Application {

Model model;

@Override
public void start(Stage primaryStage) throws Exception {

    model = new Model();

    BorderPane bp = new BorderPane();
    primaryStage.setScene(new Scene(bp));

    //this is the component that should be connected to model.myText
    TextField textField = new TextField();

    bp.setCenter(textField);        
    primaryStage.show();

}

问题

  1. 用户可以在 textField 控件中写入文本,文本应保存到 model.myText 中。
  2. 在应用程序启动期间,我需要将数据加载到模型中并将其呈现给控件。
    我尝试过使用 JavaFX 2.x 绑定,但它们似乎专注于单向连接。我有哪些选择可以巧妙地完成此任务?
4

3 回答 3

4

一种方法是使用AFAIKmyTextProperty.bindBidirectional()代替。myTextProperty.bind()

于 2012-07-04T15:06:04.493 回答
3

好的,我写了一些 SSCCE 示例代码,因为代码更准确地解释了事情:)

第一个例子是这个问题:

import javafx.application.Application;
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();
        textField.setText(model.getMyText());

        Button btn = new Button();
        btn.setText("Done");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                model.setMyText(textField.getText());
                System.out.println("Done.");
                System.out.println("New value: " + model.getMyText());
            }
        });

        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 {
        private String myText = "model myText default";

        public String getMyText() {
            return myText;
        }

        public void setMyText(String myText) {
            this.myText = myText;
        }
    }
}

此示例的第二个修改版本(使用双向绑定)在此处
在这两个示例中,都尝试单击该按钮。

于 2012-07-04T14:51:24.360 回答
0

也许你看看https://github.com/laubfall/modelfx。我正是出于这个原因编写了这个库。它支持 JavaFX 组件(由层次结构组成)和驻留在 Bean 中的属性的双向绑定。有关更多文档,请参阅 Github-Project modelfx 的 Wiki-Pages。希望对您有所帮助!

ps:核心功能使用JavaFX的Bindings.bindBidrectional。

于 2013-04-02T20:54:51.930 回答