我正在JavaFX中开发一个应用程序,我希望在单个Person
类中表示Person的信息。我遇到了一个教程,其中一个人的名字被表示为StringProperty
而不是String
。我已经搜索了这些差异并发现了this和this,但是我的解释还不足以让我抓住这个概念。网上的一些帖子表示使用StringProperty
优于String
但是无法提及它们。
现在我的问题是:在StringProperty
上使用String
需要什么条件?这样做有什么好处?
为什么:
StringProperty firstName;
通过这个:
String firstName;
答案 0 :(得分:12)
何时使用StringProperty firstName over String firstName?
当其他人观察到此firstName
变量时使用它。你也可以通过附加一个监听器来观察它。您可以在与JavaFX的其他可观察对象的绑定中使用此变量。在某些情况下,必须使用JavaFX属性,例如使用可编辑的tableView呈现的Person列表。要在编辑的单元格中立即反映更改,基础边界字段应该是属性。
答案 1 :(得分:8)
JavaFX尝试启用MVC模式。应使用“属性”创建模型以利用“绑定”。在您的情况下,Model是Person类,因此您只需添加StringProperty firstName即可。但是在JavaFX中,你必须像Pojo Bean中的简单getter和setter那样处理其他命名约定。
JavaFX中Properties的命名约定是:
public class Person {
private StringProperty firstName;
public void setFirstName(String value) { firstNameProperty().set(value); }
public String getFirstName() { return firstNameProperty().get(); }
public StringProperty firstNameProperty() {
if (firstName == null) firstName = new SimpleStringProperty(this, "firstName");
return firstName;
}
private StringProperty lastName;
public void setLastName(String value) { lastNameProperty().set(value); }
public String getLastName() { return lastNameProperty().get(); }
public StringProperty lastNameProperty() {
if (lastName == null) lastName = new SimpleStringProperty(this, "lastName");
return lastName;
}
}
之后,您可以将TableView的TableColumn绑定到Property" lastName"
TableView<Person> table = new TableView<Person>();
ObservableList<Person> teamMembers = getTeamMembers();
table.setItems(teamMembers);
TableColumn<Person,String> lastNameCol = new TableColumn<Person,String>("Last Name");
lastNameCol.setCellValueFactory(new PropertyValueFactory("lastName"));
如果没有属性,这将是更多的代码,并且您不会获得实施ChangeListener/InvalidationListener支持的优势。
上面的示例来自JavaFX TableView
因此,为JavaFX制作Model的推荐方法是使用JavaFX-Properties而不是类型的构建。