2015-07-07 1 views
9

Ich entwickle eine Anwendung in JavaFX, wo ich Informationen einer Person in einer einzigen Person Klasse darstellen möchte. Ich stieß auf ein Tutorial, in dem der Name einer Person als StringProperty anstelle von String dargestellt wurde. Ich habe nach den Unterschieden von diesen gesucht und this und this herausgefunden, aber die Erklärung dort ist nicht genug für mich, um das Konzept zu ergreifen. Einige Post im Netz sagte, es gibt Vorteile der Verwendung StringProperty über String, aber konnte sie nicht erwähnen.Wann sollte StringProperty über String verwendet werden?

Jetzt ist meine Frage: Welche Bedingungen erfordern eine StringProperty über String zu verwenden und was sind die Vorteile dabei?

Warum dies:

StringProperty firstName;

Über diese:

String firstName;

Antwort

9

Wann StringProperty firstName über String firstName zu verwenden?

Verwenden Sie es, wenn diese firstName Variable von anderen beobachtet wird. Sie können es auch beobachten, indem Sie einen Listener anhängen. Sie können diese Variable in Bindungen mit anderen beobachtbaren Objekten von JavaFX verwenden. Unter bestimmten Umständen ist es erforderlich, die JavaFX-Eigenschaft zu verwenden, wie die Personenliste, die mit editierbarer Tabellenansicht gerendert wird. Um die Änderungen sofort in der bearbeiteten Zelle widerzuspiegeln, sollte das zugrunde liegende gebundene Feld eine Eigenschaft sein.

+0

direkt zur Erklärung der Punkte !!! – JWizard

7

JavaFX versucht, das MVC-Muster zu ermöglichen. Das Modell sollte mit Eigenschaften erstellt werden, um die Bindung zu nutzen. In Ihrem Fall ist das Modell die Person-Klasse, Sie können also einfach StringProperty firstName hinzufügen. Aber in JavaFX musst du dich um die anderen Namenskonventionen kümmern wie um einfache Getter und Setter in einem Pojo Bean.

Naming Convention für Properties in JavaFX sind:

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; 
    } 
} 

Danach können Sie zum Beispiel eine Table eines Tableview auf die Eigenschaft „Nachname“

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")); 

Ohne Eigentum diese binden können, wäre viel mehr Code und Sie werden nicht die Vorteile der implementierten ChangeListener/InvalidationListener Unterstützung haben.

Das obige Beispiel stammt aus JavaFX TableView

So ist der empfohlene Weg, um ein Modell für JavaFX wird bei der Herstellung mit JavaFX-Eigenschaften und nicht die Build-in-Typen.

+0

So scheint es, dass dies einige Erweiterungen der JavaBeans bietet? – JWizard

+0

Ja, genau so ist es implementiert. Siehe das [Tutorial] (http://docs.oracle.com/javase/8/javafx/properties-binding-tutorial/binding.htm#JFXBD107) –