2016-06-02 9 views
0

ich folgende Klasse haben:Bindung zwei Klasseneigenschaften mit Tableview Spalte in JavaFX

public class Person { 
    private final StringProperty firstName; 
    private final StringProperty lastName; 

    public String getFirstName() { 
     return firstName.get(); 
    } 

    public void setFirstName(String firstName) { 
     this.firstName.set(firstName); 
    } 

    public StringProperty firstNameProperty() { 
     return firstName; 
    } 

    public String getLastName() { 
     return lastName.get(); 
    } 

    public void setLastName(String lastName) { 
     this.lastName.set(lastName); 
    } 

    public StringProperty lastNameProperty() { 
     return lastName; 
    } 

    public StringProperty getName() { 
     return new SimpleStringProperty(firstName.get() + " " + lastName.get()); 
    } 
} 

Dann habe ich eine Tableview, wo ich beide Namen in einer Spalte angezeigt werden:

@FXML 
private TableView<Person> personTable; 
@FXML 
private TableColumn<Person, String> name; 

@FXML 
private void initialize() { 
    name.setCellValueFactory(cellData -> cellData.getValue().getName()); 

    personTable.getSelectionModel().selectedItemProperty().addListener(
      (observable, oldVal, newVal) -> showDetails(newVal)); 
} 

Und jetzt kann ich Änderungen an meinem Person-Objekt vornehmen, diese werden jedoch nicht in der TableView-Spalte angezeigt. Wenn ich das Bearbeitungsfenster wieder öffne, sehe ich neue Werte, aber in meinem TableView sehe ich alte. Was kann ich tun?

Antwort

1

Do

public class Person { 

    private final ReadOnlyStringWrapper name = new ReadOnlyStringWrapper(); 

    private final StringProperty firstName = new SimpleStringProperty(); 
    private final StringProperty lastName = new SimpleStringProperty(); 

    public Person() { 

     name.bind(Bindings.concat(firstName, " ", lastName)); 
     // existing code... 
    } 

    // existing code... 

    public ReadOnlyStringProperty nameProperty() { 
     return name.getReadOnlyProperty(); 
    } 

    public final String getName() { 
     return name.get(); 
    } 
} 

und dann können Sie

@FXML 
private TableColumn<Person, String> name; 

@FXML 
private void initialize() { 
    name.setCellValueFactory(cellData -> cellData.getValue().nameProperty()); 
} 

Alternativ dazu können Sie den vollständigen Namen vollständig aus der Person Klasse weglassen und die Bindung nur erstellen, wo Sie es in der Zelle Wert benötigen Fabrik:

name.setCellValueFactory(cellData -> Bindings.concat(
    cellData.getValue().firstNameProperty(), 
    " ", 
    cellData.getValue().lastNameProperty())); 
+0

Es funktioniert wunderbar. Vielen Dank. – blaballong