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);
}
}