2015-07-07 13 views
9

Sto sviluppando un'applicazione in JavaFX in cui voglio rappresentare le informazioni di una persona in una singola classe Person. Mi sono imbattuto in un tutorial in cui il nome di una persona veniva rappresentato come StringProperty anziché String. Ho cercato le differenze di questi e scoperto this e this ma la spiegazione non mi è sufficiente per afferrare il concetto. Alcuni post in rete dicono che ci sono dei vantaggi nell'usare StringProperty su String ma non potrei menzionarli.Quando utilizzare StringProperty su String?

Ora la mia domanda è: quali condizioni richiedono uno per utilizzare StringProperty su String e quali sono i vantaggi di farlo?

Perchè questo:

StringProperty firstName;

Durante questo:

String firstName;

risposta

9

Quando utilizzare StringProperty firstName su String firstName?

Utilizzarlo quando questa variabile firstName verrà osservata da altri. Puoi anche osservarlo collegando un ascoltatore. È possibile utilizzare questa variabile nei binding con altri oggetti osservabili di JavaFX. In alcune circostanze è obbligatorio utilizzare la proprietà JavaFX, come l'elenco di persone visualizzate con tableView che è modificabile. Per riflettere le modifiche immediatamente nella cella modificata, il campo associato sottostante dovrebbe essere una proprietà.

+0

direttamente alla spiegazione del punto !!! – JWizard

7

JavaFX cerca di abilitare l'MVC-Pattern. Il modello deve essere creato con Proprietà per sfruttare il collegamento. Nel tuo caso il Modello è la classe Persona, quindi puoi semplicemente aggiungere il nomePreciso a StringProperty. Ma in JavaFX devi occuparti delle altre convenzioni di denominazione come getter e setter semplici in un Pojo Bean.

Naming Convention per Properties in JavaFX sono:

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

Dopo di che è in grado di legarsi ad esempio, un TableColumn di un TableView alla proprietà "cognome"

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

Senza una proprietà presente sarebbe molto più codice e non avrai i vantaggi del supporto implementato ChangeListener/InvalidationListener.

L'esempio viene da JavaFX TableView

Quindi il modo consigliato nella realizzazione di un modello per JavaFX sta usando JavaFX-Properties e non la configurazione in tipi.

+0

Quindi sembra che questo offra alcune estensioni ai JavaBeans? – JWizard

+0

Sì, è esattamente come è implementato. Vedere il [tutorial] (http://docs.oracle.com/javase/8/javafx/properties-binding-tutorial/binding.htm#JFXBD107) –

Problemi correlati