【问题标题】:Binding the text of a TextField to some object (JavaFX)将 TextField 的文本绑定到某个对象(JavaFX)
【发布时间】:2014-12-20 01:45:32
【问题描述】:

我已经挣扎了一个小时来完成一件非常基本的事情。事实上,我有一个名为 Template 的类,它拥有一个 Map<String,String>

public class Template extends AbstractLateXElement {
    protected final Map<String, String> parameters = new HashMap<>();
    // many unrelevant code
}

然后我有一个名为TemplateForm 的类,它是通过将Template 作为参数构造的JavaFX 形式。它为地图的每个键创建一个字段并设置关联的值。我希望在文本字段中进行任何更改以相应地更改地图中的相关对。我知道我可以使用textProperty().bind(),但我想保持Template 类完全独立于JavaFX。

我可以考虑一些包装类来包装我的地图并提供绑定方法,但我更喜欢在这里定义一个简单的更改侦听器。但是,在深入研究文档后,我发现没有任何效果:

  • 我尝试定义 onInputMethodTextChanged 属性,但我的侦听器从未被解雇
  • 我尝试在onKeyTyped 方法中使用TextField.getText 设置值,但getText 返回的值并不总是与字段中显示的值同步
  • 我发现 TextInputControl.Content 类对我来说是完美的,但受到保护等)。

在不需要修改Template 的情况下做我想做的最好的方法是什么?

【问题讨论】:

    标签: java textfield onchange javafx-8


    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 2017-03-17
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 2011-08-09
      相关资源
      最近更新 更多