如何在模型 class 中使用集合类型作为 javafx.beans.property

How to use collection types in model class as javafx.beans.property

我一直在编写我的第一个 javafx 应用程序。有几个模型 classes。我像往常一样描述实体 classes。 F.e:

class Person {
    private String firstName;
    private String lastName;

    // getters and setters bellow.....
}

我遇到了一个 article,其中作者建议对模型的所有字段使用属性 class。 F.e.:

public class NewPerson {

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

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

public StringProperty firstNameProperty() {
    return firstName;
}

public String getLastName() {
    return lastName.get();
}

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

public StringProperty lastNameProperty() {
    return lastName;
} }

这很好用!但是如何使用 java.util.Collections 和 Properties 方式呢?我应该如何"wrap"他们呢? F.e。我想使用:

// set of user's certificates
private Set<Certificate> certificates;

作为 NewPerson class 中的 属性 会怎样?

你应该这样使用SetProperty

// set of user's certificates
private SetProperty<Certificate> certificates;

然后,您可以使用 ObservableSet. You can construct an ObservableSet with the help of FXCollections.observableSet(E... elements).

设置值

这取决于您希望 API 看起来像什么。最简单的版本是:

public class User {

    private final ObservableSet<Certificate> certificates = FXCollections.observableSet();

    public ObservableSet<Certificate> getCertificates() {
        return certificates ;
    }

    // other properties...
}

这允许相当多的功能:

User user = new User();

user.getCertificates().addListener((SetChangeListener.Change<? extends Certificate> change) -> {
    if (change.wasAdded()) {
        // ...
    }
    if (change.wasRemoved()) {
        // ...
    }
});

Set<Certificate> someCertificates = ... ;
user.getCertificates().setAll(someCertificates);
user.getCertificates().add(new Certificate());

ObservableSet<Certificate> anotherSet = ... ;
Bindings.bindContent(user.getCertificates(), anotherSet);
// etc...

唯一不允许您从外部插入您自己的集合实现。 IE。你做不到

User user = new User();
ObservableSet<Certificate> certificates = ... ;
user.setCertificates(certificates);

请注意,这只是与

真正不同的地方
user.getCertificates().setAll(certificates);

如果您有想要使用的 ObservableSet 的特定实现,或者如果您有一个模型 class 已经包含 ObservableSet<Certificate>(在后一种情况下,你仍然可以考虑 Bindings.bindContentBidirectional(user.getCertificates(), certificates))。如果你真的需要 setCertificates(...) API,那么创建一个 SetProperty<Certificate>:

public class User {

    private final SetProperty<Certificate> certificates 
        = new SimpleSetProperty<>(FXCollections.observableSet());

    public final ObservableSet<Certificate> getCertificates() {
        return certificatesProperty().get();
    }

    public final void setCertificate(ObservableSet<Certificate> certificates) {
        certificatesProperty().set(certificates);
    }

    public SetProperty<Certificate> certificatesProperty() {
        return certificates ;
    }

    // other properties....
}