【问题标题】:Convert POJO to JavaFX Property将 POJO 转换为 JavaFX 属性
【发布时间】:2014-05-29 19:07:19
【问题描述】:

在我的项目中,我有许多 POJO,其字段显示在 JavaFX GUI 中。我目前使用手动刷新来更新 UI——每当 POJO 发生变化时,我都会调用 refresh() 方法。我想尝试使用绑定来完成此操作,这需要使用 JavaFX 属性。虽然我可以更改对象,但它的内部字段是其他对象,我无法更改(它们是使用 GSON 填充的,AFAIK 使用“普通”Java 对象——例如 String,而不是 StringProperty)。此外,该对象是只读的——它只有 getter,没有 setter。

我相信我可以使用 ReadOnlyJavaBeanObjectPropertyBuilder(是的 Java 命名?)或 ReadOnlyObjectWrapper 将对象包装为属性。但是,内部字段(我想要将标签绑定到的字段)不会转换为属性。有没有办法进行这种递归转换——将包含普通对象字段的整个对象转换为包含更多属性的属性?这甚至是必要的——我做错了什么吗?

编辑:我怀疑任何解决方案都必须使用反射。

【问题讨论】:

  • 我认为您的刷新可能是唯一的方法。这是我做的一个相关答案,stackoverflow.com/a/22107105/2855515
  • 我目前正在测试 BeanPathAdapter,正如@Jurgen 所建议的那样。它似乎做了我想做的大部分事情。这将需要我为对象实现 setter,但这不是什么大问题(尽管永远不应该调用 setter)。

标签: java properties javafx javafx-8 pojo


【解决方案1】:

我不确定,但看看BeanPathAdapter

JFXtras-Labs 的一部分,可下载jar

来源是 GitHub 上的here

【讨论】:

  • 这看起来可能有效。 JavaDoc 似乎有一些格式问题,这可能会使开始使用它有点困难,但我应该弄清楚。谢谢!我目前正在使用 ControlsFX 库来创建对话框。看起来我可以使用 JFXtras 来复制它,但他们的对话框控件现在看起来有点粗糙。
【解决方案2】:

POJO 的适配器怎么样?

例子

public class Person{
  private String name;
  private Address addr;

  \\getters, setters...
}

对于 JavaFX GUI

public class FXPerson{
  public FXPerson(Person p){
    this.name = \\build StringProperty
    this.fxaddr = \\build ObjectProperty<FXAddress>
  }

  private StringProperty name;
  private ObjectProperty<FXAddress> fxaddr;
}

缺点: 对于每个 POJO,您都必须编写一个适配器。如果 POJO 发生变化(例如新属性等),您将需要更新相应的适配器。

【讨论】:

  • 沿着这些路线的东西会起作用......除此之外,使用您的示例,地址类将有更多需要访问的对象,并且还会有更多对象作为字段Person 类(每个类也有对象作为字段)。简而言之,我希望有一些更自动化的解决方案的原因是因为手动操作会付出很大的努力而收效甚微。
  • 如果 POJO 有一个 Enum 成员呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 2019-07-06
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多