我现在一直在努力做一个非常基本的事情。实际上,我有一个名为Template
的班级,其中包含Map<String,String>
:
public class Template extends AbstractLateXElement {
protected final Map<String, String> parameters = new HashMap<>();
// many unrelevant code
}
然后我有一个名为TemplateForm
的类,它是一个以Template
作为参数构造的JavaFX表单。它为地图的每个键创建一个字段并设置相关值。我希望在textfields中进行任何更改,以相应地更改地图中的相关对。我知道我可以使用textProperty().bind()
但我希望保持Template
类完全独立于JavaFX。
我可以考虑一些包装类来包装我的map并提供绑定方法,但我更喜欢这里是一个简单的更改侦听器来定义。但是,在深入了解文档后,我发现没有任何效果:
onInputMethodTextChanged
属性,但我的听众从未被解雇TextField.getText
方法中使用onKeyTyped
设置值,但getText
返回的值并不总是与字段中显示的值同步TextInputControl.Content
课程对我来说很完美但受到保护等等。“在不需要修改Template
的情况下,做什么的最佳方法是什么?
答案 0 :(得分:1)
嗯,这有点愚蠢......必须将聆听者添加到textProperty
,从而产生明显的代码(在TemplateForm
中):
// t is an instance of Template
final Map<String,String> params = t.getParameters();
Iterator<Map.Entry<String,String>> it = params.entrySet().iterator();
Map.Entry<String,String> param;
int i;
for (i=0, param = it.hasNext() ? it.next() : null ; param != null ; i++, param = it.hasNext() ? it.next() : null) {
Label label = new Label();
TextField field = new TextField(param.getValue());
final String key = param.getKey();
field.textProperty().addListener((ObservableValue<? extends String> obs, String oldValue, String newValue) -> params.put(key,newValue));
// unrelevant code
}