将POJO转换为JavaFX属性

将POJO转换为JavaFX属性,java,properties,javafx,javafx-8,pojo,Java,Properties,Javafx,Javafx 8,Pojo,在我的项目中,我有许多POJO,它们的字段显示在JavaFXGUI中。我目前使用手动刷新来更新UI–每当POJO发生更改时,我都会调用refresh()方法。我想尝试使用绑定来实现这一点,这需要使用JavaFX属性。虽然我可以更改对象,但其内部字段是其他对象,我无法更改(它们是使用GSON填充的,AFAIK使用“普通”Java对象–例如String,而不是StringProperty)。此外,对象是只读的——它只有getter,没有setter 我相信我可以使用ReadOnlyJavaBeanO

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

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


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

POJO的适配器如何

范例

以及JavaFXGUI

公共类FXPerson{
公众人士(p){
this.name=\\build StringProperty
this.fxaddr=\\build ObjectProperty
}
私有财产名称;
私有对象属性fxaddr;
}
缺点:
对于每个POJO,您都必须编写一个适配器。如果POJO发生更改(例如,新属性等),则需要更新相应的适配器。

我不确定,但请查看

它是JFXtras实验室的一部分,可下载


源代码在GitHub上。

按照这些思路,某些东西会起作用。。。除此之外,使用您的示例,Address类将有更多需要访问的对象,Person类中还会有更多的对象作为字段(每个类也都有对象作为字段)。简言之,我希望有一些更自动化的解决方案的原因是,手动执行此操作需要付出大量的努力,但收获不大。如果POJO有Enum成员呢?我认为刷新可能是唯一的方法。这是我做的一个相关的回答,。我目前正在测试BeanPathaAdapter,正如@Jurgen所建议的。它似乎做了我想做的大部分事情。这将需要我为对象实现setter,但这并不是一个太大的问题(但永远不应该调用setter)。这看起来可能会奏效。JavaDoc似乎有一些格式问题,这可能会使它的入门变得有点困难,但我应该弄清楚。谢谢我目前正在使用ControlsFX库创建对话框。看起来我可能会使用JFXtras来复制它,但是它们的对话框控件现在看起来处于更粗糙的状态。
public class Person{
  private String name;
  private Address addr;

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

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