将TextField的文本绑定到某个对象(JavaFX)

时间:2014-12-20 01:45:32

标签: java textfield onchange javafx-8

我现在一直在努力做一个非常基本的事情。实际上,我有一个名为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的情况下,做什么的最佳方法是什么?

1 个答案:

答案 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
}