TreeTableView 将嵌套值添加到 TreeItemPropertyValueFactory

TreeTableView add nested value to TreeItemPropertyValueFactory

我需要将两列("Id" 和 "Workplace")的内容添加到我的 TreeTableView 中。 我不知道该怎么做,因为我无法从 Manager -> ArrayList 获取嵌套值。 如果内容类型只能是String,TreeItemPropertyValueFactory应该传什么???

其余代码工作正常。 如果有任何帮助,我将不胜感激。

public void showStaffInTreeTable(){
        Employee emp_1 = new Employee("1", "secretary");
        Employee emp_2 = new Employee("2", "cleaner");
        Employee emp_3 = new Employee("3", "driver");
        Employee emp_4 = new Employee("4", "mechanic");

        ArrayList<Employee> johnStaff = new ArrayList<>(Arrays.asList(emp_1, emp_2));
        ArrayList<Employee> amandaStaff = new ArrayList<>(Arrays.asList(emp_3, emp_4));

        Manager john = new Manager("John", johnStaff);
        Manager amanda = new Manager("Amanda", amandaStaff);

        TreeTableColumn<Manager, String> columnManager = new TreeTableColumn<>("Manager");
        TreeTableColumn<Manager, String> columnStaffId = new TreeTableColumn<>("Id");
        TreeTableColumn<Manager, String> columnStaffWorkplace = new TreeTableColumn<>("Workplace");

        columnManager.setCellValueFactory(new TreeItemPropertyValueFactory<>("managersName"));
        columnStaffId.setCellValueFactory(new TreeItemPropertyValueFactory<>
                ("how to pass here: Manager-> ArrayList<Employess> -> getEmployee -> getId???"));
        columnStaffWorkplace.setCellValueFactory(new TreeItemPropertyValueFactory<>
                ("how to pass here: Manager-> ArrayList<Employess> -> getEmployee -> getWorkplace???"));

        TreeTableView<Manager> managers = new TreeTableView<>();
        managers.getColumns().addAll(columnManager, columnStaffId, columnStaffWorkplace);

        TreeItem managerItem_1 = new TreeItem(john);
        managerItem_1.getChildren().addAll(new TreeItem<>(emp_1), new TreeItem<>(emp_2));
        TreeItem managerItem_2 = new TreeItem(amanda);
        managerItem_2.getChildren().addAll(new TreeItem<>(emp_3), new TreeItem<>(emp_4));

        TreeItem root = new TreeItem(new Manager("", new ArrayList<>()));
        root.getChildren().addAll(managerItem_1, managerItem_2);
        root.setExpanded(true);

        managers.setRoot(root);
    }
public class Employee {
    private String id;
    private String workplace;

    public Employee(String id, String workplace) {
        this.id = id;
        this.workplace = workplace;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getWorkplace() {
        return workplace;
    }

    public void setWorkplace(String workplace) {
        this.workplace = workplace;
    }
}
public class Manager {
    private String managersName;
    private List<Employee> managersStaff = new ArrayList<>();

    public Manager(String managersName, List<Employee> managersStaff) {
        this.managersName = managersName;
        this.managersStaff = managersStaff;
    }

    public String getManagersName() {
        return managersName;
    }

    public void setManagersName(String managersName) {
        this.managersName = managersName;
    }

    public List<Employee> getManagersStaff() {
        return managersStaff;
    }

    public void setManagersStaff(List<Employee> managersStaff) {
        this.managersStaff = managersStaff;
    }
}

你可以做到

columnStaffId.setCellValueFactory(cellData -> {
    TreeItem<?> item = cellData.getValue();
    Object data = item.getValue();
    if (data instanceof Employee) {
        Employee employee = (Employee)data ;
        return new SimpleStringProperty(employee.getId());
    } else {
        return new SimpleStringProperty("");
    }
});

注意 Java 14 您可以将其简化为

columnStaffId.setCellValueFactory(cellData -> {
    if (cellData.getValue().getValue() instanceof Employee employee) {
        return new SimpleStringProperty(employee.getId());
    } else {
        return new SimpleStringProperty("");
    }
});

您的设置有点奇怪,因为您声明了 TreeTableView<Manager>,但有些项目不包含 Manager,而是 Employee。因此,无法真正保证您不会在此处的某些地方抛出 ClassCastException,或者由 TreeItemPropertyValueFactory 试图在非 [= 的对象上调用 getManagersName() 引起的其他错误13=]。

您可能想要重构,以便使用 TreeTableView<Object>,或者重构模型,以便 ManagerEmployee 都是其他模型的子class class(然后将其用作 TreeTableView 的类型)。