TableView / CellValueFactory - 根据另一个属性的值更改显示的属性

时间:2017-07-26 12:59:08

标签: java javafx tableview

我有一个TableView填充了自定义对象;该表显示该对象的属性。

我的问题是如何根据该行的另一个属性的值将不同的属性绑定到列?

例如,假设我有这个对象:

public class MyObject() {
    private SimpleStringProperty name = new SimpleStringProperty("");
    private SimpleStringProperty type = new SimpleStringProperty("");
}

现在在TableView中,我有两列:

+---------+--------+
| NAME    | TYPE   |
+---------+--------+
| Robert  | Mgr    |
+---------+--------+

但是,如果type = "Something",我希望Type列实际显示name属性的值:

+---------+--------+
| NAME    | TYPE   |
+---------+--------+
| Robert  | Robert |
+---------+--------+

我不清楚如何根据同一对象实例中另一个属性的值设置不同的PropertyValueFactory

2 个答案:

答案 0 :(得分:1)

你应该可以这样做:

编辑以显示列定义 - 这需要将对象作为整体,而不是字符串。

@FXML 
private TableColumn<MyObject,MyObject> changingColumn;

...

//Where you initialize the table
changingColumn.setCellValueFactory(cellData -> new ReadOnlyObjectWrapper<>(cellData.getValue()));
changingColumn.setCellFactory(tc -> new TableCell<MyObject, MyObject>() {
        @Override
        public void updateItem(MyObject item, boolean empty) {
            super.updateItem(item, empty);
            if (item == null || empty) {
                setText("");
            } else if ("something".equals(item.getType())){
                setText(item.getName());
            }else {
                setText(item.getType());
            }
        }
    });

答案 1 :(得分:0)

我也可以使用以下解决方案:

colType.setCellValueFactory(param -> {
            if (param.getValue() != null) {
                if (param.getValue().getType().equals("Something")) {
                    return new SimpleStringProperty(param.getValue().getName);
                } else {
                    return new SimpleStringProperty(param.getValue().getType());
                }
            } else {
                return new SimpleStringProperty("");
            }
        });