将POJO转换为JavaFX属性

3
在我的项目中,有许多POJO,它们的字段在JavaFX GUI中显示。我目前使用手动刷新来更新UI - 每当POJO更改时,我调用refresh()方法。相反,我想尝试使用绑定来完成这项任务,这需要使用JavaFX属性。虽然我可以更改对象,但它的内部字段是其他对象,我无法更改它们(它们使用GSON填充,该填充使用“常规”Java对象 - 例如String,而不是StringProperty)。此外,对象是只读的 - 它只有getter,没有setter。
我认为我可以使用ReadOnlyJavaBeanObjectPropertyBuilder(yay Java命名?)或ReadOnlyObjectWrapper将对象包装为属性。但是,我想要将标签绑定到的内部字段并未转换为属性。是否有办法进行递归转换 - 将包含普通对象字段的整个对象转换为包含更多属性的属性?这是必要的吗 - 我做错了什么吗?
编辑:我怀疑任何解决方案都必须使用反射。

我认为刷新可能是唯一的方法。这里有一个相关的答案,https://dev59.com/rX3aa4cB1Zd3GeqPYBX0#22107105。 - brian
我目前正在测试BeanPathAdapter,正如@Jurgen所建议的那样。它似乎可以完成我想要的大部分功能。这将要求我为对象实现setter方法,但这并不是太大的问题(尽管setter方法应该永远不会被调用)。 - omor1
2个回答

4

我不确定,但可以看一下BeanPathAdapter

它是JFXtras-Labs的一部分,可从jar下载。

源代码在GitHub上here


这看起来可能会起作用。JavaDoc似乎存在一些格式问题,这可能会使入门变得有点困难,但我应该能够解决它。谢谢! 我目前正在使用ControlsFX库创建对话框。看起来我可能可以使用JFXtras来复制这个,但是他们的对话框控件现在看起来使用起来有点困难。 - omor1

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发生更改(例如,新增属性等),您需要更新相应的适配器。


类似这样的东西会起作用……除了使用您的示例,Address类将有进一步需要访问的对象,并且在Person类中也会有更多的对象作为字段(每个字段也都有对象)。简而言之,我希望有更多自动化的解决方案的原因是手动完成这项工作需要付出很大的努力,但收益却不大。 - omor1
如果POJO有一个枚举成员怎么办? - mils

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接