java - 我如何将两个子字符串绑定(bind)到一个?

标签 java data-binding javafx

我有两个字符串

private StringProperties firstName;
private StringProperties lastName;
private StringProperties nickName;

名字和姓氏由用户选择,昵称是名字和姓氏的前3个字符的串联

我该怎么做?

实际上我是这样初始化它的(这是整个类)。

public class Person {
private StringProperty firstName;
private StringProperty lastName;
private StringProperty nickName;
private ObservableList<Evento> eventi = FXCollections.observableArrayList();

public Person(String firstName, String lastName) {
    this.firstName = new SimpleStringProperty(firstName);
    this.lastName = new SimpleStringProperty(lastName);
    if (firstName.length() > 2 && lastName.length() > 2)
        this.nickName = new SimpleStringProperty(firstName.trim().substring(0,3).concat(lastName.trim().substring(0,3)));
    else
        this.nickName = new SimpleStringProperty("");
}

public ObservableList<Evento> getEventi() {
    return eventi;
}

public String getFirstName() {
    if(firstName == null) firstName = new SimpleStringProperty(this,"firstName");
    return firstName.get();
}

public StringProperty firstNameProperty() {
    return firstName;
}

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

public String getLastName() {
    if(lastName == null) lastName = new SimpleStringProperty(this, "lastName");
    return lastName.get();
}

public StringProperty lastNameProperty() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName.set(lastName);
}

public String getNickName() {
    if(nickName == null) nickName = new SimpleStringProperty(this,"nickName");
    return nickName.get();
}

public StringProperty nickNameProperty() {
    return nickName;
}

@Override
public String toString() {
    return getNickName() + "(" + getLastName() + " " + getFirstName() + ")";
}

但是当我让用户更改名字或姓氏时,昵称不会更新。

最佳答案

您应该使用 ReadOnlyStringProperty 作为昵称:

private ReadOnlyStringWrapper nickName= new ReadOnlyStringWrapper();
...
public final String getNickName() {
    return nickName.get();
}

public final ReadOnlyStringProperty nickNameProperty() {
    return nickName.getReadOnlyProperty();
}

至于绑定(bind),您可以使用 Bindings 类中的实用方法或为任何其他复杂情况实现您自己的绑定(bind)。此示例使用 createStringBinding() 方法。它采用 Callable 功能接口(interface),将用于计算新值,以及可观察属性列表,将观察哪些值的变化:

public Person(String firstName, String lastName) {
    this.firstName = new SimpleStringProperty(firstName);
    this.lastName = new SimpleStringProperty(lastName);

    this.nickName.bind(Bindings.createStringBinding(()->{
        if(this.firstName.get().length() > 2 && this.lastName.get().length() > 2) {
            return this.firstName.get().substring(0,3).concat(this.lastName.get().trim().substring(0,3));
        } else {
            return "";
        }
    }, this.firstName, this.lastName));

}

关于java - 我如何将两个子字符串绑定(bind)到一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38421186/

相关文章:

java - 如何在运行时向 JXTable 添加新行?

java - wsdl2java xmlbeans 数据绑定(bind)问题

data-binding - 列表的 Dart/Polymer 绑定(bind)对象属性

java - 复制实体集合并持久保存在 Hibernate/JPA 中

java - classcastexception : cant be cast to com. sun.jersey.spi.container.servlet.ServletContainer

wpf - 将 StringFormat 和 Converter 绑定(bind)在一起

javafx - 如何设置 slider 更改监听器仅在 JavaFX 中释放鼠标拖动时触发?

java - 选择项目后组合框中的图像消失

JavaFX - 将 Canvas 保存到 png 文件

java - 在不同的线程中调用 onNext (RxJava Android)