何时在String上使用StringProperty?

时间:2015-07-07 10:49:55

标签: string binding javafx

我正在JavaFX中开发一个应用程序,我希望在单个Person类中表示Person的信息。我遇到了一个教程,其中一个人的名字被表示为StringProperty而不是String。我已经搜索了这些差异并发现了thisthis,但是我的解释还不足以让我抓住这个概念。网上的一些帖子表示使用StringProperty优于String但是无法提及它们。

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

为什么:

StringProperty firstName;

通过这个:

String firstName;

2 个答案:

答案 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

因此,为Ja​​vaFX制作Model的推荐方法是使用JavaFX-Properties而不是类型的构建。