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

使用JavaFX属性的JavaBean包装

相旭
2023-03-14

我希望将JavaFX属性用于UI绑定,但我不希望它们出现在我的模型类中(请参见在模型类中使用JavaFX.Beans属性)。我的模型类有getter和setter,我想基于这些创建属性。例如,假设一个实例bean具有字符串getName()setname(String name)方法,我将编写

 SimpleStringProperty property = new SimpleStringProperty(bean, "name")

希望property.set(“foobar”)会触发对bean.setname的调用。但这似乎不起作用。我错过了什么?

共有1个答案

锺离嘉容
2023-03-14

Simple*Property类是它们对应的Property抽象类的完整的独立实现,并且不依赖于任何其他对象。因此,例如,SimpleStringProperty包含一个(private)String字段,该字段本身保存属性的当前值。

您显示的构造函数的参数:

new SimpleStringProperty(bean, "name")

分别是:

    null
public class Person {
    private final StringProperty firstName 
        = new SimpleStringProperty(this, "firstName");

    public final String getFirstName() {
        return firstName.get();
    }

    public final void setFirstName(String firstName) {
        this.firstName.set(firstName);
    }

    public StringProperty firstNameProperty() {
        return firstName ;
    }

    // ... other properties, etc
}

您正在寻找的功能:将现有的Java Bean样式属性包装在JavaFX可观察属性中,由JavaFX.beans.property.adapter包中的类实现。例如,您可以

StringProperty nameProperty = new JavaBeanStringPropertyBuilder()
        .bean(bean)
        .name("name")
        .build();

呼叫

nameProperty.set("James");

使用此设置将有效地导致调用

bean.setName("James");
bean.setName(...);
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

public class Bean {

    private String name ;
    private final PropertyChangeSupport propertySupport ;

    public Bean(String name) {
        this.name = name ;
        this.propertySupport = new PropertyChangeSupport(this);
    }

    public Bean() {
        this("");
    }

    public String getName() {
        return name ;
    }

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

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertySupport.addPropertyChangeListener(listener);
    }
}

然后是下面的代码:

Bean bean = new Bean();
StringProperty nameProperty() = new JavaBeanStringPropertyBuilder()
        .bean(bean)
        .name("name")
        .build();
nameProperty().addListener((obs, oldName, newName) -> System.out.println("name changed from "+oldName+" to "+newName));
bean.setName("James");
System.out.println(nameProperty().get());

将产生输出:

name changed from to James 
James

如果JavaBean不支持PropertyChangeListener,那么通过bean.setname(...)对bean的更改将不会传播到ChangeListeners或InvalidationListenerJavaBeanStringProperty注册的JavaEanStringProperty

public class Bean {

    public Bean() {
        this("");
    }

    public Bean(String name) {
        this.name = name ;
    }

    private String name ;

    public String getName() {
        return name ;
    }

    public void setName(String name) {
        this.name = name ;
    }
}
James
 类似资料:
  • 问题内容: 可以说我有一堂课: 我有一个此类的ArrayList 是否可以使用对象名称属性作为选择选项来创建JavaFX ComboBox,而无需使用对象名称创建新的JavaFX ComboBox ? 伪代码: (可选)理想情况下,虽然应该显示名称,但在选择了一个选项后,该名称应该返回给我所选的Dummy的引用,而不仅仅是名称。那可能吗? 问题答案: 您可以使用自定义方式来显示适合您需求的项目:

  • 我正在使用JavaFX属性的模型实体consitiing witch允许我更改单个位置上的值,将它们绑定到UI,并在模型实体数组中添加带有额外条件的更改的监听器(惟一值等)。 我必须将模型存储在数据库中,所以问题如下: 注意:一些可绑定属性根本不必持久化。

  • 主要内容:JavaFX属性的类型,读/可写属性,只读属性,JavaFX JavaBean,属性更改事件JavaFX属性存储控件的内部状态,并允许我们监听来自JavaFX UI控件的状态更改。JavaFX属性可以彼此绑定。绑定行为允许属性根据来自另一个属性的更改值来同步其值。 JavaFX属性的类型 有两种类型的JavaFX属性: 读写(Read/Writable) 只读(Read-Only) JavaFX的属性包含实际值,并提供更改支持,无效支持和绑定功能。所有JavaFX属性类都位于包命名空间

  • 我正在使用将属性绑定到Spring Boot项目中的java bean,如下所示:(示例摘自spring文档) 但是在Spring Boot Docs中有一个警告 映射到Spring Boot中可用的@ConfigurationProperties类的属性(通过属性文件、YAML文件、环境变量等配置)是公共API,但类本身的访问器(getter/setter)并不意味着直接使用。

  • 问题内容: 如果我的Java类中有一个属性’gId’,该accessor方法应命名为什么? 这就是我的假设。 如果有一个属性,我认为应该是,这种外观很难看(尽管这并不是指女孩的另一种拼写)。 如果该属性只是方法名称,那么我不会首先将该属性命名为URL,这会使访问器再次变得丑陋- 我记得在Javabean Specification PDF的某处读到了有关属性的大写以及涉及首字母缩略词的案例,但现在

  • 我试图将Lombok与JavaFX属性结合使用: 这将为属性本身生成getter和setter: null getID():int 集合id(int id) GetIdProperty():SimpleIntegerProperty getName():string setName(字符串名称) GetNameProperty():SimpleStringProperty ... 这在龙目岛支持吗