gpt4 book ai didi

java - 树 TableView : Displaying different data types

转载 作者:行者123 更新时间:2023-12-01 21:18:09 27 4
gpt4 key购买 nike


我有一个 Factory 类,其中包含员工列表。我想使用 TreeTableView 来显示 Factory 数据。显示工厂的名称和大小是相当不错的,但我不知道如何显示员工的姓名!

public class Factory {
private String name;
private double size;
private List<Employee> employees;

public Factory(name, size){this.name=name; this.size=size}

// Getters & setters

}

我想要以下输出:

enter image description here

可以折叠工厂。

最佳答案

TreeView中或TreeTableView树中的所有节点必须属于同一类型。这使得你想要的设计(这是非常自然的)变得有些痛苦。基本上,您必须创建 TreeView 的类型或TreeTableView树中所需的所有行类型的最具体的父类(super class):即在本例中为 TreeTableView 的类型需要是两者的父类(super class) EmployeeFactory 。然后,列上的单元格值工厂必须对行对象进行类型测试,以确定返回什么值。

拥有一个对象模型是不寻常的,其中这些对象模型通过继承相关,而不是两者都是 Object 的子类。 ,所以您可能需要 TreeTableView<Object>在这里。

粗略地说(如果您使用普通的旧 JavaBean 样式,而不是推荐的 JavaFX properties ),您将定义类似的内容

TreeTableView<Object> treeTable = new TreeTableView<>();
treeTable.setShowRoot(false);

TreeTableColumn<Object, String> nameColumn = new TreeTableColumn<>("Name");
nameColumn.setCellValueFactory(cellData -> {
TreeItem<Object> rowItem = cellData.getValue();
if (rowItem != null && (rowItem.getValue() instanceof Factory)) {
Factory f = (Factory) rowItem.getValue() ;
return new SimpleStringProperty(f.getName());
} else {
return new SimpleStringProperty("");
}
});

TreeTableColumn<Object, Number> sizeColumn = new TreeTableColumn<>("Size");
sizeColumn.setCellValueFactory(cellData -> {
TreeItem<Object> rowItem = cellData.getValue();
if (rowItem != null && (rowItem.getValue() instanceof Factory)) {
Factory f = (Factory) rowItem.getValue() ;
return new SimpleObjectProperty<Number>(Double.valueOf(f.getSize()));
} else {
return new SimpleObjectProperty<Number>(null);
}
});

TreeTableColumn<Object, String> employeeColumn = new TreeTableColumn<>("Employee");
employeeColumn.setCellValueFactory(cellData -> {
TreeItem<Object> rowItem = cellData.getValue();
if (rowItem != null && (rowItem.getValue() instanceof Employee)) {
Employee emp = (Employee) rowItem.getValue() ;
return new SimpleStringProperty(emp.getName());
} else {
return new SimpleStringProperty("");
}
});

treeTable.getColumns().addAll(nameColumn, sizeColumn, employeeColumn);

当然你用它填充

// fully initialized list of factories, with employee lists initialized:
List<Factory> factories = ... ;

TreeItem<Object> root = new TreeItem<>(null);
for (Factory factory : factories) {
TreeItem<Object> factoryItem = new TreeItem<>(factory);
root.getChildren().add(factoryItem);
for (Employee emp : factory.getEmployees()) {
TreeItem<Object> employeeItem = new TreeItem<>(emp);
factoryItem.getChildren().add(employeeItem);
}
}
treeTable.setRoot(root);

这是一个使用此的简单 SSCCE:

import java.util.ArrayList;
import java.util.List;

import javafx.application.Application;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableView;
import javafx.stage.Stage;

public class TreeTableExample extends Application {

@Override
public void start(Stage primaryStage) {
TreeTableView<Object> treeTable = new TreeTableView<>();
treeTable.setShowRoot(false);

TreeTableColumn<Object, String> nameColumn = new TreeTableColumn<>("Name");
nameColumn.setCellValueFactory(cellData -> {
TreeItem<Object> rowItem = cellData.getValue();
if (rowItem != null && (rowItem.getValue() instanceof Factory)) {
Factory f = (Factory) rowItem.getValue() ;
return new SimpleStringProperty(f.getName());
} else {
return new SimpleStringProperty("");
}
});

TreeTableColumn<Object, Number> sizeColumn = new TreeTableColumn<>("Size");
sizeColumn.setCellValueFactory(cellData -> {
TreeItem<Object> rowItem = cellData.getValue();
if (rowItem != null && (rowItem.getValue() instanceof Factory)) {
Factory f = (Factory) rowItem.getValue() ;
return new SimpleObjectProperty<Number>(Double.valueOf(f.getSize()));
} else {
return new SimpleObjectProperty<Number>(null);
}
});

TreeTableColumn<Object, String> employeeColumn = new TreeTableColumn<>("Employee");
employeeColumn.setCellValueFactory(cellData -> {
TreeItem<Object> rowItem = cellData.getValue();
if (rowItem != null && (rowItem.getValue() instanceof Employee)) {
Employee emp = (Employee) rowItem.getValue() ;
return new SimpleStringProperty(emp.getName());
} else {
return new SimpleStringProperty("");
}
});

treeTable.getColumns().addAll(nameColumn, sizeColumn, employeeColumn);

List<Factory> factories = createData();
TreeItem<Object> root = new TreeItem<>(null);
for (Factory factory : factories) {
TreeItem<Object> factoryItem = new TreeItem<>(factory);
root.getChildren().add(factoryItem);
for (Employee emp : factory.getEmployees()) {
TreeItem<Object> employeeItem = new TreeItem<>(emp);
factoryItem.getChildren().add(employeeItem);
}
}
treeTable.setRoot(root);

Scene scene = new Scene(treeTable, 800, 800);
primaryStage.setScene(scene);
primaryStage.show();
}

private List<Factory> createData() {
String[][] empNames = {
{"John", "Jane", "Mary"},
{"Susan", "Mike"},
{"Alex", "Francois", "Joanne"}
};
List<Factory> factories = new ArrayList<>();
for (String[] emps : empNames) {
int count = factories.size()+1 ;
Factory f = new Factory("Factory "+ count, count*10);
for (String empName : emps) {
f.getEmployees().add(new Employee(empName));
}
factories.add(f);
}
return factories ;
}

public static class Employee {
private String name ;

public Employee(String name) {
this.name = name ;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}


}

public class Factory {
private String name ;
private double size ;
private List<Employee> employees ;

public Factory(String name, double size) {
this.name = name ;
this.size = size ;
this.employees = new ArrayList<>();
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public double getSize() {
return size;
}

public void setSize(double size) {
this.size = size;
}

public List<Employee> getEmployees() {
return employees;
}


}

public static void main(String[] args) {
launch(args);
}
}

enter image description here

<小时/>

另一种方法,我认为有点人为,是创建一个表示 TableView 中的行的类,然后创建 FactoryEmployee它的子类:

public abstract class EmploymentEntity {

public String getName() {
return null ;
}

public Double getSize() {
return null ;
}

public String getEmployeeName {
return null ;
}
}

然后

public class Employee extends EmploymentEntity {
private String name ;

public Employee(String name) {
this.name = name ;
}

@Override
public String getEmployeeName() {
return name ;
}

public void setEmployeeName(String name) {
this.name = name ;
}
}

public class Factory extends EmploymentEntity {

private String name ;
private double size ;
private List<Employee> employees ;

public Factory(String name, double size) {
this.name = name ;
this.size = size ;
this.employees = new ArrayList<>();
}

@Override
public String getName() {
return name ;
}

public void setName(String name) {
this.name = name ;
}

@Override
public Double getSize() {
return size ;
}

public void setSize(double size) {
this.size = size ;
}

public List<Employee> getEmployees() {
return employees ;
}
}

这个对象模型确实不自然(无论如何对我来说),但它确实使表格变得更容易一些:

TreeTableView<EmploymentEntity> treeTable = new TreeTableView<>();
TreeTableColumn<EmploymentEntity, String> nameColumn = new TreeTableColumn<>("Name");
nameColumn.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getValue().getName()));
TreeTableColumn<EmploymentEntity, Number> sizeColumn = new TreeTableColumn<>("Size");
sizeColumn.setCellValueFactory(cellData -> new SimpleObjectProperty<Number>(cellData.getValue().getValue().getSize()));
TreeTableColumn<EmploymentEntity, String> employeeColumn = new TreeTableColumn<>("Employee");
employeeColumn.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getValue().getEmployeeName()));
// etc...

关于java - 树 TableView : Displaying different data types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39596980/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com