2017-06-20 20 views
0

我們假設我有一個實體類Foo,它包含一些字段,getters,setter和構造函數。例如:是否可以創建一個屬性來監聽javafx中自定義對象的變化?

public class Foo { 
private Integer a = 0; 
private Integer b = 0; 

public Foo() { 
} 

public Integer getA() { 
    return a; 
} 

public void setA(Integer a) { 
    this.a = a; 
} 

public Integer getB() { 
    return b; 
} 

public void setB(Integer b) { 
    this.b = b; 
} 
} 

然後我想知道什麼時候a或b發生了變化。我知道javaFX中有一個ObjectProperty。所以我創建對象屬性:

ObjectProperty<Foo> fooProperty = new SimpleObjectProperty<>(new Foo()); 

然後爲了瞭解A和B場的變化,我添加的ChangeListener:

fooProperty.addListener((observable, oldValue, newValue) -> { 
    System.out.println("Property changed!"); 
}); 

然後實驗:

fooProperty.set(new Foo()); 

工作好,但下一行:

fooProperty.get().setA(10) 

不會調用偵聽器。原因很明顯。最後一行實際上不會更改Foo對象(引用保持不變)。

我有一些可能的解決方案。但他們都不夠優雅。例如,將每個字段更改爲屬性併爲每個變量添加相同的偵聽器。

所以,問題是。添加偵聽器以更改自定義對象字段的方法是什麼?

+0

這難道不是通過將'a'和'b'實現爲'IntegerProperty'並使用固定的'Foo'實例解決的嗎?或者我誤解了這個問題? –

回答

0

不知道這是不是你想要的,你可以把它作爲參考。

首先我創建一個類,它的功能是攜帶信息。

public class EventObj{ 
    private String message; 
    private Object newObj; 

    public EventObj(String msg, Object obj){ 
    this.message = msg; 
    this.newObj = obj; 
    } 

    public String getMessage(){ 
    return this.message; 
    } 

    public Object getNewObj(){ 
    return this.newObj; 
    } 
} 

然後,創建Foo類,它有兩個對象字段,我們要聽他們是否改變。

public class Foo{ 
    private SimpleObjectProperty<Object> a; 
    private SimpleObjectProperty<Object> b; 

    private SimpleObjectProperty<EventObj> out; 


    public Foo(){ 
    a = new SimpleObjectProperty<>(); 
    b = new SimpleObjectProperty<>(); 
    out = new SimpleObjectProperty<>(); 
    initEvent(); 
    } 

    private void initEvent(){ 
    a.addListener(new ChangeListener<Object>(){ 
     @Override 
     public void changed(ObservableValue<? extends Object> observable, Object oldValue, Object newValue){ 
     out.set(new EventObj("a changed", newValue)); 
     } 
    }); 

    b.addListener(new ChangeListener<Object>(){ 
     @Override 
     public void changed(ObservableValue<? extends Object> observable, Object oldValue, Object newValue){ 
     out.set(new EventObj("b changed", newValue)); 
     } 
    }); 
    } 

    public void setA(Object a){ 
    this.a.set(a); 
    } 

    public void setB(Object b){ 
    this.b.set(b); 
    } 

    public SimpleObjectProperty<EventObj> outProperty(){ 
    return out; 
    } 
} 

在其他類中,使用下面的代碼來偵聽foo中的a或b是否有變化。

Foo foo = new Foo(); 
foo.outProperty().addListener(new ChangeListener<EventObj>(){ 
    @Override 
    public void changed(ObservableValue<? extends EventObj> observable, EventObj oldValue, EventObj newValue){ 
    System.out.println(newValue.getMessage() + ", new value is : " + newValue.getNewObj()); 
    } 
}); 

foo.setA(new Object()); 
foo.setB(new Object()); 
在這種情況下

,我們只需要使用Object類,如果你想使用自定義類來代替,不要忘了覆蓋其的hashCode()和equals()方法來確定兩個對象是否是相同。

+0

謝謝,這比我擁有的所有可能性都要好。 –

+0

@NazariiMediukh不客氣, 我很樂意幫助你。 – yab

相關問題