Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 绑定可观察列表<;TextField>;上市地产<;字符串>;JFX_Java_Data Binding_Javafx - Fatal编程技术网

Java 绑定可观察列表<;TextField>;上市地产<;字符串>;JFX

Java 绑定可观察列表<;TextField>;上市地产<;字符串>;JFX,java,data-binding,javafx,Java,Data Binding,Javafx,给定 我有一个模型类model,它包含以下字段: StringProperty-StringProperty;ListProperty listOfStringsProperty 我有一个视图类view extensed VBox,它具有以下内容: TextField-stringTextField;TextFieldList字符串TextFieldList textfieldlistextensedvbox是我创建的一个自定义类,它处理多个TextFields,使用nice+和-按钮添加和删除

给定

我有一个模型类
model
,它包含以下字段:

StringProperty-StringProperty;ListProperty listOfStringsProperty

我有一个视图类
view extensed VBox
,它具有以下内容:

TextField-stringTextField;TextFieldList字符串TextFieldList

textfieldlistextensedvbox
是我创建的一个自定义类,它处理多个
TextFields
,使用nice+和-按钮添加和删除输入文本字段

TextFieldList
类包含字段
ObservableList inputTextFields
,我可以通过方法调用
List getData()


问题:

我能够做到以下几点:

stringTextField.textProperty().bindBidirectional(model.getStringProperty());
为了将
视图中的
stringTextField
的结果绑定到
模型中的
stringProperty

我需要做一些类似的事情

stringsTextFieldList.listProperty().bindBidirectional(model.getListOfStringsProperty());
我该怎么做

如果此设计不起作用,那么您建议我如何修复它?是否有一个与
TextFieldList
相同的内置类,而不是
扩展控件

您可以使用

这是一个特殊的绑定,使列表与可观察列表保持同步。请记住,这并不是双向的


如果需要双向性,则应使用无效侦听器或更改侦听器来检测更改并手动同步列表。您可能需要一些粗略的锁定机制来防止堆栈溢出。

如果您决定创建自己的控件,则应手动创建“绑定”,这意味着在输入
可观察列表中添加一个,然后处理示例中的类似操作:检查是否添加了新项,删除或更新并相应地维护您的
TextField
s。这是可能的,但我的答案主要是建议一个现有的控件来重复使用,而不是创建自己的控件

如果你不想重新发明轮子:

我不知道您的确切用例,但是重用一个实际支持数据模型的控件(比如一个数据库)可能是合理的

在这个示例中,我修改了模型类,使其具有一个
ObservableList
,而不是一个
ListProperty
(注意:也可以在列表中简单地包含
String
对象,我只是修改了它以使绑定非常清晰)。我添加了一个
ListView
,并用于将
TextField
s绘制为列表中的元素,这些元素双向绑定到列表中相应的
StringProperty
。我还添加了几个按钮来添加和删除元素,以及一个按钮来打印模型的当前内容

示例:

Model.java

公共类模型{
公众可观察的财产清单;
公共模型(){
listOfStringsProperty=FXCollections.observableArrayList();
}
}
Main.java

public类主扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
试一试{
BorderPane根=新的BorderPane();
场景=新场景(根,400400);
模型m=新模型();
m、 listOfStringsProperty.addAll(新的SimpleStringProperty(“第一”),
新SimpleStringProperty(“第二”),
新SimpleStringProperty(“第三”);
ListView lv=新建ListView();
lv.setCellFactory(新回调(){
@凌驾
公共ListCell调用(ListView参数){
返回新的ListCell(){
@凌驾
受保护的void updateItem(StringProperty项,布尔值为空){
super.updateItem(项,空);
如果(项==null){
setText(空);
设置图形(空);
返回;
}
TextField tf=新的TextField();
tf.textProperty().bindbiodical(项);
设置图形(tf);
}
};
}
});
lv.集合项目(m.listOfStringsProperty);
根。设置中心(lv);
//控制按钮
HBox HBox=新的HBox();
按钮按钮D=新按钮(“添加”);
ButtonAd.setOnAction(e->m.listOfStringsProperty.add(新的SimpleStringProperty(“”));
按钮按钮删除=新按钮(“删除最后一个”);
按钮remove.setOnAction(e->m.listOfStringsProperty.remove(m.listOfStringsProperty.size()-1));
按钮按钮打印模式=新按钮(“打印模式”);
buttonPrintModel.setOnAction(e->System.out.println(m.listOfStringsProperty.toString());
hbox.getChildren().addAll(ButtonAd、buttonRemove、buttonPrintModel);
根.立根(hbox);
初级阶段。场景(场景);
primaryStage.show();
}捕获(例外e){
e、 printStackTrace();
}
}
公共静态void main(字符串[]args){
发射(args);
}
}
这将产生以下窗口:

public class Model {

    public ObservableList<StringProperty> listOfStringsProperty;

    public Model(){
        listOfStringsProperty = FXCollections.observableArrayList();    
    }

}
public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            Scene scene = new Scene(root,400,400);      

            Model m = new Model();
            m.listOfStringsProperty.addAll(new SimpleStringProperty("First"),
                    new SimpleStringProperty("Second"),
                    new SimpleStringProperty("Third"));

            ListView<StringProperty> lv = new ListView<StringProperty>();
            lv.setCellFactory(new Callback<ListView<StringProperty>, ListCell<StringProperty>>() {

                @Override
                public ListCell<StringProperty> call(ListView<StringProperty> param) {
                    return new ListCell<StringProperty>(){

                        @Override
                        protected void updateItem(StringProperty item, boolean empty) {

                            super.updateItem(item, empty);

                            if(item == null){
                                setText(null);
                                setGraphic(null);
                                return;
                            }

                            TextField tf = new TextField();
                            tf.textProperty().bindBidirectional(item);
                            setGraphic(tf);
                        }
                    };
                }
            });


            lv.setItems(m.listOfStringsProperty);

            root.setCenter(lv);

            // Control buttons
            HBox hbox = new HBox();
            Button buttonAdd = new Button("Add");
            buttonAdd.setOnAction(e -> m.listOfStringsProperty.add(new SimpleStringProperty("")));

            Button buttonRemove = new Button("Remove last");
            buttonRemove.setOnAction(e -> m.listOfStringsProperty.remove(m.listOfStringsProperty.size()-1));

            Button buttonPrintModel = new Button("Print model");
            buttonPrintModel.setOnAction(e -> System.out.println(m.listOfStringsProperty.toString()));

            hbox.getChildren().addAll(buttonAdd, buttonRemove, buttonPrintModel);


            root.setBottom(hbox);

            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

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