【问题标题】:How i can bind two substring to one?我如何将两个子字符串绑定到一个?
【发布时间】:2016-11-20 03:27:36
【问题描述】:

我有两个字符串

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

名字和姓氏由用户选择,昵称是名字和姓氏的前三个字符的连接

我该怎么做?

其实我是这样初始化的(这是整个类)。

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() + ")";
}

}

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

【问题讨论】:

  • 您还有其他更新firstNameLastName的方法吗?
  • 我有一个用于更新名字和姓氏的 GUI,只是用整个 Person 类编辑了 OP

标签: java data-binding javafx


【解决方案1】:

您应该使用ReadOnlyStringProperty 作为昵称:

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

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

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

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));

}

【讨论】:

    【解决方案2】:

    你可以使用Bindings.format:

    nickName.bind(Bindings.format("%.3s%.3s", firstName, lastName));
    

    %.3s 中的3 是字符串的最大长度。


    但这不会对字符串进行任何修剪,(您可以在将字符串传递给firstNamelastName 之前执行此操作)。

    它也适用于小于 3 个字符的字符串。因此,您可以获得像 FoBarFooBBar 这样的昵称(如果名字是空字符串)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      • 2017-10-25
      相关资源
      最近更新 更多