为了处理来自数据库的数据我实现了表数据网关。所以,我有两张桌子:
CREATE TABLE student (
id INT,
id groupId,
name VARCHAR(100),
surname VARCHAR(100)
);
CREATE TABLE group (
id INT,
name VARCHAR(100)
);
我有两个DTO。严格来说,一个表的一个DTO
class Student{
private int id;
private int groupId;
private String name;
private String surname;
//+getters and setters
}
class Group{
private int id;
private String name;
//+getters and setters
}
我有两个TableDataGateway类,可以将DTO加载并保存到DB。
class StudentTableDataGateway extends AbstractTableDataGateway{
....
}
class GroupTableDataGateway extends AbstractTableDataGateway{
....
}
现在我想通过javafx创建学生表,其中包含以下列:
|Student ID|Student Name|Student Surname|Group Name|
在这里我停下来。我无法理解如何为表视图构建数据以及接下来应该做什么。请帮帮我。
编辑1
最困难的部分(最让我困惑的是)如何链接从学生对象中的组对象获取数据?因为,在学生班级字段“私人小组”中制作是非常不受欢迎的。原因是,如果我们为每个tableview修改域类,它们将非常糟糕。例如,如果我们需要创建另一个包含列的表视图:
|student name|student surname|teacher name
那么我们还会向Student class添加一个字段吗?
答案 0 :(得分:1)
如果你有getter,你唯一需要做的就是为你的表创建set table属性。例如:
TableView<Student> table = new TableView<>();
TableColumn<Student,Integer> userId = new TableColumn<>("User Id");
userId.setCellValueFactory(new PropertyValueFactory<>("id"));
这将在您的Student对象类中查找getId()
并从中添加数据。
唯一棘手的部分是群组名称,因为它属于不同的类别。我可能只在Student类中包含helper方法。你不需要在那里拥有任何财产。只需要有类似getter的方法
public String getGroupName() {
return ""//Code to find group name here;
}
以下是这种情况下您需要的所有代码:
ObservableList<Student> students = FXCollections.observableArrayList();
students.addAll(one);
TableView<Student> table = new TableView<>();
TableColumn<Student,Integer> userId = new TableColumn<>("User Id");
userId.setCellValueFactory(new PropertyValueFactory<>("id"));
TableColumn<Student,String> groupName = new TableColumn<>("Group Name");
groupName.setCellValueFactory(new PropertyValueFactory<>("groupName"));
TableColumn<Student,String> name = new TableColumn<>("User Name");
name.setCellValueFactory(new PropertyValueFactory<>("name"));
TableColumn<Student,String> surname = new TableColumn<>("User Surname");
surname.setCellValueFactory(new PropertyValueFactory<>("surname"));
table.getColumns().addAll(userId,groupId,name,surname);
table.setItems(students);
但groupName总是有其他选项:
1)创建自定义CellValueFactory和setCellValueFactory()
groupName.setCellValueFactory(data->{
Student student = data.getValue();
String strGroupName = "";// calculate group name for...
return new ReadOnlyStringWrapper(strGroupName);
}
);
2)使用你需要的所有getter创建缓冲区对象