也許我錯過了JavaFX綁定或SimpleStringProperty中存在一個錯誤。在JavaFX 2.0中綁定
當我運行這個測試代碼時,我改變的模型值沒有得到新的值。測試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
}
}
}
}
嗨, 感謝您的回答。他們是否忘記了直接設置值的選項?例如,我不想讓我的模型與JavaFX Properties混淆。 我更新了我的問題,並解決了問題,爲我解決了問題。如果我想直接綁定我的模型,還有更多我需要考慮嗎? – McPepper