2015-07-07 3 views
9

Я разрабатываю приложение в JavaFX, где я хочу представлять информацию Лица в одном классе Person. Я наткнулся на учебник, в котором имя человека представлялось как StringProperty вместо String. Я искал различия в них и обнаружил this и this, но объяснений там недостаточно для того, чтобы захватить концепцию. Некоторые сообщения в сети говорят, что есть преимущества использования StringProperty за String, но не могли не упомянуть их.Когда использовать StringProperty над String?

Теперь мой вопрос: какие условия требуют использования StringProperty по сравнению с String и в чем преимущества этого?

Почему это:

StringProperty firstName;

Поверх:

String firstName;

ответ

9

Когда использовать StringProperty firstName над строкой firstName?

Используйте это, когда переменная, находящаяся под напряжением firstName, будет соблюдаться другими. Вы также можете наблюдать за ним, присоединяя слушателя. Вы можете использовать эту переменную в привязках к другим наблюдаемым объектам JavaFX. В некоторых случаях обязательным является использование свойства JavaFX, например, списка Person, отображаемого с помощью tableView, который доступен для редактирования. Чтобы отразить изменения непосредственно в редактируемой ячейке, основное связанное поле должно быть свойством.

+0

прямо к описанию точки !!! – JWizard

7

JavaFX пытается включить MVC-шаблон. Модель должна быть создана с помощью свойств, чтобы воспользоваться Связыванием. В вашем случае модель представляет собой класс Person, поэтому вы можете просто добавить имяStringProperty firstName. Но в JavaFX вы должны позаботиться о другом соглашении об именах, как для простого getter и setter в Bejo Pojo.

Naming Convention для Properties в 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; 
    } 
} 

После этого вы сможете связать, например, TableColumn в виде TableView в собственности "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 использует JavaFX-свойства, а не строить в типах.

+0

Так кажется, что это предлагает некоторые расширения для JavaBeans? – JWizard

+0

Да, это именно то, как оно реализовано. См. [Учебник] (http://docs.oracle.com/javase/8/javafx/properties-binding-tutorial/binding.htm#JFXBD107) –

Смежные вопросы