当前位置: 首页 > 知识库问答 >
问题:

是否可以在javafx中创建一个侦听自定义对象更改的属性?

胥智
2023-03-14

让我们假设我有一个实体类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中有一个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对象(引用保持不变)。

我有一些可能的解决方案。但是它们都不够优雅。例如将每个字段更改为属性并为每个变量添加相同的侦听器。

所以,问题是。如何添加自定义对象字段更改的侦听器?

共有1个答案

南门展
2023-03-14

不知道这是不是你想要的,你可以参考一下。

首先我创建了一个类,它的功能是承载信息。

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类,它有两个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;
  }
}

在其他类中,使用下面的代码来监听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()方法以确定两个对象是否相同。

 类似资料:
  • 问题内容: 我想知道如何在java中设置自己的侦听器。例如,我有一个将数字从1递增到100的函数。我想在值达到50时设置侦听器。我该怎么做?请给我建议任何教程。 问题答案: 查看使用侦听器的所有类的源代码。实际上,这很容易: 为您的听众创建一个界面,例如 维护清单 侦听器应在每个事件上进行遍历,然后遍历列表并使用一些事件参数调用适当的方法 至于观察者模式以及一些Java代码,请看维基百科。

  • 嗨,我有一个很可能很愚蠢的问题。我刚开始玩弄属性和ChangeListener,但遇到了一个障碍。我知道,如果我创建了一个包含数组列表的对象属性,那么只有当数组列表本身发生变化时,任何ChangeListener才会启动。但是,如果出现以下情况,我希望所有ChangeListener都启动 阵列列表本身会更改 数组列表的长度会更改(即添加或删除元素) 将ArrayList中的元素更改为其他元素 数

  • 问题内容: 在数学课上,我们学习了如何定义新的运算符。例如: 这定义了法律。对于x和y的任何实数,x y是x + 2y。 范例:。 可以在JavaScript中定义这样的运算符吗?我知道函数可以胜任: 但我想使用以下语法: 代替这个: 哪个是最接近这个问题的解决方案? 问题答案: 最简洁的答案是不。ECMAScript(标准JS所基于的)不支持运算符重载。 可以使用sweet.js之类的第三方工具

  • 问题内容: 是否可以在jQuery中创建可以绑定到任何样式更改的事件侦听器?例如,如果我想在元素更改尺寸或对style属性进行任何其他更改时“执行”操作,则可以执行以下操作: 这将非常有用。 有任何想法吗? 更新 很抱歉自己回答这个问题,但是我写了一个可能适合其他人的简洁解决方案: 这将临时覆盖内部prototype.css方法,并在最后使用触发器重新定义它。所以它是这样的: 问题答案: 由于jQ

  • 我们在JavaFX中创建了一个小型绘画应用程序。出现了一个新要求,我们必须警告用户,他做了更改,这些更改尚未持久化,并询问他,用户是否想在关闭前先保存。 快照示例: 不幸的是,有很多不同的节点,节点可以通过多种方式进行更改,例如多边形点可以移动。节点本身可以拖动。它们可以旋转等等。因此,在为Node对象对画布的每一次可能的更改触发无数事件之前,我想问一下,是否有人知道如何简化这种方法。我很好奇,如

  • 问题内容: 让我们考虑以下情况。有一个,有一个。子窗格将添加到父窗格。考虑到可以动态地添加和删除子窗格而没有任何限制和顺序的情况下,如何才能仅在可见子窗格的情况下使parentPane可见。当然childPane的可见状态也可以随时更改。是否可以创建动态Bindings.OR,以便我可以动态向其添加/删除子可见属性?如果是,那怎么办?如果没有,那么在这种情况下使用什么解决方案? 问题答案: 您可以