1

也许我误解了 JavaFX 绑定,或者 SimpleStringProperty 中存在错误。

当我运行这个测试代码时,我更改的模型值没有得到新值。测试 testBindingToModel 失败。我认为我的模型应该使用 TextField tf 的值进行更新。但只有 prop1Binding 的绑定值获得值“test”。

public class BindingTest {  
    private TextField tf;
    private Model model;
    private ModelBinding mb;

    @Before
    public void prepare() {
        tf = new TextField();
        model = new Model();
        mb = new ModelBinding(model);
        Bindings.bindBidirectional(tf.textProperty(), mb.prop1Binding);
    }

    @Test
    public void testBindingToMB() {
        tf.setText("test");

        assertEquals(tf.getText(), mb.prop1Binding.get());
    }

    @Test
    public void testBindingToModel() {
        tf.setText("test");

        assertEquals(tf.getText(), mb.prop1Binding.get());
        assertEquals(tf.getText(), model.getProp1());
    }

    private static class ModelBinding {
        private final StringProperty prop1Binding;

        public ModelBinding(Model model) {
            prop1Binding = new SimpleStringProperty(model, "prop1");
        }

    }

    private static class Model {
        private String prop1;

        public String getProp1() {
            return prop1;
        }

        public void setProp1(String prop1) {
            this.prop1 = prop1;
        }       
    }
    }

谢谢你的帮助。

最好的问候塞巴斯蒂安

编辑:有了这个类,我可以直接设置模型的值。我将在接下来的几天里测试这门课,并用我的结果评论这篇文章。

public class MySimpleStringProperty extends SimpleStringProperty {
    public MySimpleStringProperty(Object obj, String name) {
        super(obj, name);
    }

    public MySimpleStringProperty(Object obj, String name, String initVal) {
        super(obj, name, initVal);
    }

    @Override
    public void set(String arg0) {
        super.set(arg0);
        if (this.getBean() != null) {
            try {
                Field f = this.getBean().getClass().getDeclaredField(this.getName());
                f.setAccessible(true);
                f.set(this.getBean(), arg0);
            } catch (NoSuchFieldException e) {
                // logging here
            } catch (SecurityException e) {
                // logging here
            } catch (IllegalArgumentException e) {
                // logging here
            } catch (IllegalAccessException e) {
                // logging here
            }
        }
    }
}
4

2 回答 2

2

不幸的是,这个构造函数没有附加SimpleStringProperty到一个 bean 对象上。它只是说SimpleStringProperty属于哪个bean属性。

例如,如果你想在你的类中拥有一个属性,你应该这样做:

public static class Model {

    private StringProperty prop1 = 
          new SimpleStringProperty(this, "prop1", "default_value");

    public String getProp1() {
        return prop1.get();
    }

    public void setProp1(String value) {
        prop1.set(value);
    }

    public StringProperty prop1Property() {
        return prop1;
    }
}

请注意,无法绑定到您的原始Model类,因为它不提供有关设置新prop1值的事件。如果你想拥有可观察的模型,你应该从一开始就使用 fx 属性。

于 2012-10-04T15:24:32.373 回答
2

刚刚发现提供了 JavaBeanStringProperty 类,它正好满足了我的要求。

使用此代码,我可以直接将我的 bean 的值绑定到 StringProperty(包括设置和从我的 Bean 获取我的值)。

binding = JavaBeanStringPropertyBuilder.create().beanClass(Model.class).bean(model).name("prop1").build();

我发现的唯一问题是,当您在设置绑定后更改模型的值时,例如在 TextField 中没有更新。

于 2012-10-07T11:50:59.057 回答