当并非所有属性都在同一类中时,填充JavaFX tableview

Bra*_*ram 2 java javafx properties tableview fxml

我有一个关于在JavaFX中填充TableView的问题。首先,我在javaFX中是个新手,对我的无知深表歉意。

我做了一个简单的示例,尝试了tableview的工作原理:

public class Person{

    private StringProperty firstName, lastName;
    private IntegerProperty age;

    //Left the constructor and getters out

}
Run Code Online (Sandbox Code Playgroud)

对于控制器:

public class Controller implements Initializable {

    @FXML private TableView tableView;
    @FXML private TableColumn firstNameColumn, lastNameColumn, ageColumn;

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        ObservableList<Person> data = FXCollections.observableArrayList();        
        tableView.setItems(data);

        firstNameColumn.setCellFactory(new PropertyValueFactory<Person, String>("firstName"));
        lastNameColumn.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName"));
        ageColumn.setCellValueFactory(new PropertyValueFactory<Person, Integer>("age"));

        data.add(new Person("Piet", "Jansen", 22));
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以正常工作,但是如果每个人都有一个包含名字和姓氏的Name对象,该怎么办?

例如:

public class Person{

    private Name name;
    private IntegerProperty age;

    //Left the constructor and getters out

}
Run Code Online (Sandbox Code Playgroud)

名称类别:

public class Name {

    private StringProperty firstName, lastName;

    public Name(String firstName, String lastName) {
        this.firstName = new SimpleStringProperty(firstName);
        this.lastName = new SimpleStringProperty(lastName);
    }

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

    public StringProperty firstNameProperty() {
        return firstName;
    }

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

    public StringProperty lastNameProperty() {
        return lastName;
    }
}
Run Code Online (Sandbox Code Playgroud)

提前致谢:)

Ulu*_*Biy 5

通过假定列不可编辑,您始终可以自定义在列视图呈现中显示基础模型类的属性或属性组合的方式和方式。例如,对于给定的Person模型类,您可以在tableView的一栏中显示其所有属性(姓,名,年龄等)。遵循代码:

TableColumn nameCol = new TableColumn("First and Last Name");
nameCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() {
    @Override
    public ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> p) {
        // p.getValue() returns the Person instance for a particular TableView row
        return p.getValue().getName().firstNameProperty().concat(" - ").concat(p.getValue().getName().lastNameProperty());
        // and concating maybe other attributes like: p.getValue().getOrganization().getCity().idenNumberProperty(); etc.
    }
});
Run Code Online (Sandbox Code Playgroud)

如果类Name具有常规属性,例如

private String firstName;
private String lastName;
Run Code Online (Sandbox Code Playgroud)

而不是JavaFX的SimpleStringProperty,然后

TableColumn nameCol = new TableColumn("First and Last Name");
nameCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() {
    @Override
    public ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> p) {
        return new SimpleStringProperty(p.getValue().getName().getFirstName() + " - " + p.getValue().getName().getLastName());
    }
});
Run Code Online (Sandbox Code Playgroud)

如果该列将是可编辑的,那么您需要做更多的工作,例如解析“名和姓”列项的字符串值,并将这些部分设置为Name类中的适当属性,onEditCommit()例如在处理程序中。