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

JavaFX:基于属性的实体与基于属性的包装器

李新霁
2023-03-14

我正在使用JavaFX属性的模型实体consitiing witch允许我更改单个位置上的值,将它们绑定到UI,并在模型实体数组中添加带有额外条件的更改的监听器(惟一值等)。

我必须将模型存储在数据库中,所以问题如下:

注意:一些可绑定属性根本不必持久化。

共有1个答案

子车俊哲
2023-03-14

你是否应该使用一种特定的技术是非常基于意见的,所以我不会在这里回答你的确切问题。我只会提供一些有利和不利的选择。

在带JPA注释的实体类中直接使用JavaFX属性的好处是,可以保持设计简单,只使用一个类来表示每个实体,而不是围绕带实体注释的类的包装类。

在JPA实体类中直接使用JavaFX属性的缺点是:

    null
@Entity
@Access(AccessType.PROPERTY)
public class Person {

    private IntegerProperty age ;
    private int _age ;
    private StringProperty name ;
    private String _name ;

    private int id ;

    @Id
    public int getId() {
        return id ;
    }

    public void setId(int id) {
        this.id = id ;
    }

    public IntegerProperty ageProperty() {
        if (age == null) {
            age = new SimpleIntegerProperty(_age);
        }
        return age ;
    }

    public int getAge() {
        if (age == null) {
            return _age ;
        } else {
            return age.get();
        }
    }

    public void setAge(int age) {
        if (this.age == null) {
            _age = age ;
        } else {
            this.age.set(age);
        }
    }

    public StringProperty nameProperty() {
        if (name == null) {
            name = new SimpleStringProperty(_name);
        } 
        return name ;
    }

    public String getName() {
        if (name == null) {
            return _name ;
        } else {
            return name.get();
        }
    }

    public void setName(String name) {
        if (this.name == null) {
            _name = name ;
        } else {
            this.name.set(name);
        }
    }
}

这种技术显然无法解决依赖JavaFX API的问题。

另一个可能的选择是使用带有属性更改监听器的普通JavaBean:

@Entity
public class Person {
    @Id
    private int id ;

    private int age ;
    private String name ;

    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);

    public int getAge() {
        return age ;
    }

    public void setAge(int age) {
        int oldAge = age ;
        this.age = age ;
        pcs.firePropertyChange("age", oldAge, age);
    }

    public String getName() {
        return name ;
    }

    public void setName(String name) {
        String oldName = name ;
        this.name = name ;
        pcs.firePropertyChange("name", oldName, name);
    }

    // ...
}

现在,在JavaFX客户机中,您可以执行以下操作:

TableView<Person> contactTable = new TableView<>();
TableColumn<Person, String> nameCol = new TableView<>("Name");
nameCol.setCellValueFactory(cellData -> {
    try {
        return JavaBeanStringPropertyBuilder.create()
            .bean(cellData.getValue())
            .name("name")
            .build();
    } catch (Exception exc) {
        return new RuntimeException(exc);
    }
});
public interface Person {
    public int getAge() ;
    public void setAge(int age) ;
    public String getName() ;
    public void setName(String name) ;
}
@Entity
public class PersonEntity implements Person {
    private int age ;
    private String name ;
    @Id
    private int id ;

    // get/set methods omitted...
}
public class PersonFX implements Person {
    private final StringProperty name = new SimpleStringProperty() ;
    private final IntegerProperty age = new SimpleIntegerProperty() ;

    public StringProperty nameProperty() {
        return name ;
    }

    @Override
    public final String getName() {
        return nameProperty().get();
    }

    @Override
    public final void setName(String name) {
        nameProperty().set(name);
    }

    // similarly for age...
}

现在,在JavaFX客户机中,您可以有一个JSON引擎,它在PersonFX实例之间[de]序列化JSON;在服务器上,您有一个JSON引擎,它在PersonEntity实例之间[de]序列化相同的JSON数据。由于JSON引擎将通过调用get/set方法来工作,所以从它的角度来看,对象本质上具有相同的形式。自从我开始使用JavaFX以来,我还没有使用过序列化to/from XML数据,所以我不确定同样的方法是否适用于XML数据,但我认为您也可以使用这种方法。您甚至可以通过在实现类中定义ReadObjectWriteObject方法(或者通过使用序列化代理)来实现Java序列化流。

 类似资料:
  • 如何使类示例推断类型基于实例值检查: 打字沙盒。

  • 我有一个使用Postgre 9.3和JPA2.1(Hibernate实现)的Spring MVC应用程序。我有一个类'电影',其中有一组评论。我想写一个JPA NamedQuery,它返回我所有的电影细节,但只有批准的评论。评论可以有其他状态,但我想只显示批准的评论。 我的班级如下所示: 我写的查询不会过滤评论并返回包含所有评论的电影;它的工作原理与上面显示的findMovieById查询相同。

  • 我如何使用“insref”和“pref”对下面的元素进行分组,我在xslt版本1中使用了生成密钥id。 期望的结果: 这是我所拥有的。我也在使用密钥生成函数。任何想法这个xslt有什么问题。至于计数,我正在考虑获得唯一的密钥计数。

  • 我是XSLT新手,希望能得到一些帮助。 我目前有一个XML,它包含以下格式的多个副本: 我的任务是替换id属性的值。我需要根据代码的数字部分改变这个值。如果值大于850000,格式应该改为USA868509。如果该值小于850000,则将id值更改为仅包括数字。XML中的其余值应保持完全相同。 我目前拥有以下xslt: 我很难确定要更改的值,因为XSLT不执行变量循环。有没有办法更改XSLT以获得

  • 我对xslt有这个问题。样式表中有一个名为misctable的表,它被放在一个变量miscTables中。例如在节点 id="_384PLATE"具有值A1、A2、B1。当我标记并将其与xml进行比较时,我需要保存R[@i=2]/C/@i属性的值。在这种情况下,我需要得到值2,3,26 xml xslt 非常感谢。

  • > 如何以编程方式从log4j2中的记录器中删除appender?-即使我删除appender,它仍然发送日志 如何根据java系统属性有条件地添加log4j2附加器?-appender忽略通过:export log_level=off从命令行传递变量,并始终使用默认值,在本例中均为如此。脚本解决方案也有同样的问题 -level属性不接受动态值,并引发无法将“${sys:loglevel}”强制转