何时对字符串使用StringProperty?

何时对字符串使用StringProperty?,string,binding,javafx,String,Binding,Javafx,我正在用JavaFX开发一个应用程序,我想在一个Person类中表示一个人的信息。我遇到了一个教程,其中一个人的名字被表示为StringProperty,而不是String。我已经寻找了它们之间的差异,并找到了答案,但是那里的解释不足以让我理解这个概念。网上的一些帖子说使用StringProperty比String有很多优点,但没有提及 现在我的问题是:在什么条件下需要使用StringProperty而不是String,这样做的好处是什么 为什么会这样: StringProperty first

我正在用JavaFX开发一个应用程序,我想在一个
Person
类中表示一个人的信息。我遇到了一个教程,其中一个人的名字被表示为
StringProperty
,而不是
String
。我已经寻找了它们之间的差异,并找到了答案,但是那里的解释不足以让我理解这个概念。网上的一些帖子说使用
StringProperty
String
有很多优点,但没有提及

现在我的问题是:在什么条件下需要使用
StringProperty
而不是
String
,这样做的好处是什么

为什么会这样:

StringProperty firstName

在这方面:


stringfirstname

JavaFX尝试启用MVC模式。应使用属性创建模型,以利用绑定。在您的例子中,模型是Person类,因此您可以简单地添加StringProperty名字。但是在JavaFX中,您必须注意其他命名约定,如POJObean中的简单getter和setter

JavaFX中的命名约定为:

 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绑定到属性“lastName”

TableView table=newtableview();
ObservableList teamMembers=getTeamMembers();
表2.setItems(团队成员);
TableColumn lastNameCol=新的TableColumn(“姓氏”);
lastNameCol.setCellValueFactory(新属性ValueFactory(“lastName”));
如果没有属性,这将是更多的代码,并且您将没有实现支持的优势

上面的例子来自JavaFX

因此,为JavaFX创建模型的推荐方法是使用JavaFX属性,而不是内置类型

何时使用StringProperty firstName而不是String firstName


当其他人将观察到此
firstName
变量时,请使用它。您还可以通过附加一个侦听器来观察它。您可以在与JavaFX的其他可观察对象绑定时使用此变量。在某些情况下,必须使用JavaFX属性,例如使用可编辑的tableView呈现的人员列表。为了在编辑的单元格中立即反映更改,底层绑定字段应该是一个属性。

因此,这似乎为JavaBeans提供了一些扩展?是的,这正是它的实现方式。见
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"));