Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将两个子字符串绑定到一个?_Java_Data Binding_Javafx - Fatal编程技术网

Java 如何将两个子字符串绑定到一个?

Java 如何将两个子字符串绑定到一个?,java,data-binding,javafx,Java,Data Binding,Javafx,我有两根绳子 private StringProperties firstName; private StringProperties lastName; private StringProperties nickName; 名字和姓氏由用户选择,昵称是名字和姓氏前3个字符的串联 我怎么能做到 实际上我初始化它,就像这是整个类一样 public class Person { private StringProperty firstName; private StringProperty las

我有两根绳子

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();
}
至于绑定,您可以使用Bindings类中的实用程序方法,或者为任何其他复杂情况实现您自己的绑定。此示例使用createStringBinding方法。它采用可调用函数接口(用于计算新值)和可观察属性列表(用于观察更改的值):

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

}
您应该使用ReadOnlyStringProperty作为昵称:

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

public final ReadOnlyStringProperty nickNameProperty() {
    return nickName.getReadOnlyProperty();
}
至于绑定,您可以使用Bindings类中的实用程序方法,或者为任何其他复杂情况实现您自己的绑定。此示例使用createStringBinding方法。它采用可调用函数接口(用于计算新值)和可观察属性列表(用于观察更改的值):

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

}
您可以使用Bindings.format:

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

不过,这不会对字符串进行任何修剪,您可以在将字符串传递给firstName和lastName之前进行修剪

它也适用于小于3个字符的字符串。因此,如果名字是空字符串,您可以获得FoBar、FooB或Bar等昵称。

您可以使用Bindings.format:

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

不过,这不会对字符串进行任何修剪,您可以在将字符串传递给firstName和lastName之前进行修剪


它也适用于小于3个字符的字符串。因此,如果名字是空字符串,你可以得到像FoBar、FooB或Bar这样的昵称。

你有其他方法更新firstName和LastName吗?我有一个用于更新first和LastName的GUI,刚刚用整个Person类编辑了OP你有其他方法更新firstName和LastName吗?我有一个用于更新first和LastName的GUI,刚刚用整个Person类编辑了OP