【发布时间】:2014-12-12 01:18:10
【问题描述】:
我正在为与配置类的变量链接的 gui 元素(在我的情况下为 javafx,TextField)寻找适当的更新策略。
必须满足这些规则:
1) 如果我在配置类中设置变量,则 gui 元素(文本字段)需要刷新
2) 如果我更改文本字段,则配置类中的变量需要刷新
3) 当且仅当配置类中的变量发生更改时,由于文本字段更改,必须采取一些措施。
4) 如果我更改配置中的变量,我不希望执行该操作(即通知侦听器)。
假设是这样的:
Gui.java
public TextField textField = new TextField();
Config.java
public StringProperty stringProperty = new StringProperty();
stringProperty .addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> arg0, String arg1, String arg2) {
System.out.println("config string changed").
}
});
public void update(){
// now this is causing the problem because the listener
// will know about this set() obviously
stringProperty.set("bad idea");
}
Controller.java
Gui gui = new Gui();
Config config = new Config();
// setup connection between gui element and config
gui.textField.textProperty().bindBidirectional(config.stringProperty);
我知道我可以在设置值之前删除 changeListener 然后再次添加它,但我想知道是否有适当的解决方案来解决此类问题。
编辑: 实际上我需要知道的是:是因为绑定还是因为 set() 而调用了 changed()。如果可以的话,我的问题就迎刃而解了。
谢谢!
干杯!
【问题讨论】:
-
你能澄清一下(3)吗?您是否希望在每次更改文本字段中的文本时(即每次按键等),或仅在用户“提交”更改时(例如通过按 Enter)执行此操作?
-
我想得到每一个改变。这与双向绑定非常有效。我唯一担心的是 set() 会“触发”听众。我编辑了代码以阐明可以从其他一些类调用更新方法。
标签: user-interface binding javafx