java - 在 JavaFX 中连接 View 和模型的主要方式是什么?

标签 java model-view-controller binding javafx

在 JavaFX 中连接 View 和模型的预期方法是什么?

绑定(bind)?

假设我想使用以下控件在数据库中进行定位:

enter image description here

我在内存中有数据(记录集)对象,它的属性是可绑定(bind)的。 IE。当当前记录发生变化以及记录数量发生变化时,他们会发出通知。

我希望用户能够使用 slider 和文本字段在记录集中定位。

如何实现? JavaFX中没有numeric spin,那么如何将text、slider和recordset对象(三端)绑定(bind)在一起呢?可能吗?

最佳答案

我不能给出权威的答案,因为我不为 Oracle 工作,也不是 JavaFX 专家,但我通常使用模型实例构造 Controller ,并在 Controller 的初始化方法中创建绑定(bind)控件的属性和模型的属性。

对于您的具体问题,我有一个蹩脚但可行的解决方案。蹩脚的,因为我无法弄清楚如何使用低级绑定(bind) API,并且我在模型上使用了两个属性。方法如下:

FXML:

<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.GridPane?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Slider?>

<?import javafx.scene.control.TextField?>
<GridPane fx:controller="sample.Controller"
          xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">

    <Slider GridPane.columnIndex="0" fx:id="slider" min="0" max="99"/>
    <Label GridPane.columnIndex="1" text="Record" />
    <TextField fx:id="textfield" GridPane.columnIndex="2"/>
</GridPane>

主要.java :

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import javafx.util.Callback;
import sample.Models.Model;

public class Main extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        final Model model = new Model();

        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("sample.fxml"));
        loader.setControllerFactory(new Callback<Class<?>, Object>() {
            @Override
            public Object call(Class<?> aClass) {
                return new Controller(model);
            }
        });
        GridPane root = (GridPane) loader.load();

        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }
}

Controller .java :

package sample;

import javafx.beans.binding.DoubleBinding;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Slider;
import javafx.scene.control.TextField;
import sample.Models.Model;

import java.net.URL;
import java.util.ResourceBundle;

public class Controller implements Initializable {
    private final Model model;

    public Controller(Model model) {
        this.model = model;
    }

    @FXML
    public Slider slider;
    @FXML
    public TextField textfield;

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        slider.valueProperty().bindBidirectional(model.pageProperty());
        textfield.textProperty().bindBidirectional(model.pageTextProperty());
    }
}

模型.java :

包样本.模型;

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;

public class Model {

    private IntegerProperty pageProperty;
    private StringProperty pageTextProperty;

    public Model() {
        pageProperty = new SimpleIntegerProperty(2);
        pageProperty.addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) {
                int value = pageProperty.get();
                //System.out.println("Page changed to " + value);
                if (Integer.toString(value).equals(pageTextProperty.get())) return;
                pageTextProperty.set(Integer.toString(value));
            }
        });

        pageTextProperty = new SimpleStringProperty("2");
        pageTextProperty.addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> observableValue, String s, String s2) {
                try {
                    int parsedValue = Integer.parseInt(observableValue.getValue());
                    if (parsedValue == pageProperty.get()) return;
                    pageProperty().set(parsedValue);
                } catch (NumberFormatException e) {
                    // too bad
                }
            }
        });
    }

    public int getPage() {
        return pageProperty.get();
    }

    public void setPage(int page) {
        pageProperty.set(page);
    }

    public IntegerProperty pageProperty() {
        return pageProperty;
    }

    public String getPageText() {
        return pageTextProperty.get();
    }

    public void setPageText(String pageText) {
        pageTextProperty.set(pageText);
    }

    public StringProperty pageTextProperty() {
        return pageTextProperty;
    }
}

关于java - 在 JavaFX 中连接 View 和模型的主要方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19895951/

相关文章:

java - ListView 没有出现在我的应用程序的 MainActivty 中(附图片)

java - Java Spring Hibernate 项目中更新数据库对象的最佳实践是什么

java - 如何在 Java 中获取 unicode 字符的十进制值?

django - 在templatetags之间传递上下文,Django

c# - 如何在 MVC 3 中将 Div 绑定(bind)到模型上的属性

Delphi (VCL) 泛型和数据绑定(bind)?

java - 通过sockets java下载图片

c# - 可为空的日期时间异常

java - 使用RestTemplate调用 Controller

wpf - 构造函数中的 PropertyPath 和 PathParameters