是否可以制作一个 属性 来监听 javafx 中自定义对象的变化?
Is it possible to make a property which listen to changes of custom objects in javafx?
假设我有一个实体 class Foo,其中包含一些字段、getter、setter 和构造函数。例如:
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中有一个Object属性。所以我正在创建对象 属性:
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 对象(引用保持不变)。
我有一些可能的解决方案。但都不够优雅。例如,将每个字段更改为 属性 并为每个变量添加相同的侦听器。
那么,问题来了。如何为自定义对象的字段变化添加监听器?
不知道这个是不是你想要的,可以参考一下。
首先我创建一个class,它的功能是携带信息。
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 class,它有两个 Object 字段,我们将监听它们是否发生变化。
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;
}
}
在其他 class 中,使用下面的代码来监听 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());
在这种情况下,我们只是使用对象class,如果你想使用自定义class来替换,不要忘记重写它的hashCode()和equals()方法来确定两个对象是否相同
假设我有一个实体 class Foo,其中包含一些字段、getter、setter 和构造函数。例如:
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中有一个Object属性。所以我正在创建对象 属性:
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 对象(引用保持不变)。
我有一些可能的解决方案。但都不够优雅。例如,将每个字段更改为 属性 并为每个变量添加相同的侦听器。
那么,问题来了。如何为自定义对象的字段变化添加监听器?
不知道这个是不是你想要的,可以参考一下。
首先我创建一个class,它的功能是携带信息。
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 class,它有两个 Object 字段,我们将监听它们是否发生变化。
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;
}
}
在其他 class 中,使用下面的代码来监听 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());
在这种情况下,我们只是使用对象class,如果你想使用自定义class来替换,不要忘记重写它的hashCode()和equals()方法来确定两个对象是否相同