什么时候使用 StringProperty 而不是 String?

When to use StringProperty over String?

我正在用 JavaFX 开发一个应用程序,我想在其中用单个 Person class 表示一个人的信息。我遇到了一个教程,其中一个人的名字被表示为 StringProperty 而不是 String。我搜索了它们的区别并找到了 and this 但是那里的解释不足以让我理解这个概念。网上有些 post 说 StringPropertyString 有优势,但没说。

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

为什么这样:

StringProperty firstName;

关于这个:

String firstName;

JavaFX 尝试启用 MVC 模式。应使用属性创建模型以利用绑定。在您的例子中,模型是人 class,因此您可以简单地添加 String属性 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 绑定到 属性 "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 支持的优势。

上面的例子来自JavaFXTableView

因此,为 JavaFX 制作模型的推荐方法是使用 JavaFX-Properties 而不是内置类型。

When to use StringProperty firstName over String firstName?

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