2012-10-04 59 views
1

也許我錯過了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 
      } 
     } 
    } 
} 

回答

2

剛剛發現提供了JavaBeanStringProperty類,它完全滿足了我的請求。

使用此代碼,我可以直接將我的bean的值綁定到StringProperty(包含設置並從我的Bean中獲取我的值)。

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

我發現的唯一問題是,當您在設置綁定後更改模型的值時,沒有更新,例如在TextField中。

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屬性。

+0

嗨, 感謝您的回答。他們是否忘記了直接設置值的選項?例如,我不想讓我的模型與JavaFX Properties混淆。 我更新了我的問題,並解決了問題,爲我解決了問題。如果我想直接綁定我的模型,還有更多我需要考慮嗎? – McPepper