【问题标题】:When to use StringProperty over String?何时在 String 上使用 StringProperty?
【发布时间】:2015-09-24 19:39:08
【问题描述】:

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

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

为什么会这样:

StringProperty firstName;

关于这个:

String firstName;

【问题讨论】:

    标签: string binding javafx


    【解决方案1】:

    何时使用 StringProperty firstName 而不是 String firstName?

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

    【讨论】:

      【解决方案2】:

      JavaFX 尝试启用 MVC 模式。应该使用属性创建模型以利用绑定。在您的情况下,模型是 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 绑定到属性“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,而不是内置类型。

      【讨论】:

      • 看来这为 JavaBeans 提供了一些扩展?
      • 是的,这正是它的实现方式。见tutorial
      猜你喜欢
      • 2017-04-30
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 2015-02-17
      相关资源
      最近更新 更多