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

时间:2015-08-14 08:45:20

标签: java javafx javafx-2 javafx-8

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

class Person {
    private String firstName;
    private String lastName;

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

我遇到了一个article,作者建议在模型类的所有字段中使用Properties。 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;
} }

这很好用!但是如何使用带有Properties方式的java.util.Collections?我该如何“包裹”它们? F.E.我想用:

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

它如何作为NewPerson类中的属性?

2 个答案:

答案 0 :(得分:2)

这取决于您希望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...

唯一不允许的是外部插入您自己的set实现。即你做不到

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

请注意,这与

完全不同
user.getCertificates().setAll(certificates);

如果您要使用的是ObservableSet的特定实现,或者您的模型类已经包含ObservableSet<Certificate>(在后一种情况下,您仍然可以考虑{{ 1}})。如果您确实需要Bindings.bindContentBidirectional(user.getCertificates(), certificates) API,请创建setCertificates(...)

SetProperty<Certificate>

答案 1 :(得分:1)

你应该像这样使用SetProperty

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

然后,您可以使用ObservableSet设置值。您可以在FXCollections.observableSet(E... elements)的帮助下构建ObservableSet