JavaFx表视图,表网关模式和连接

时间:2015-06-05 15:15:49

标签: java design-patterns javafx

为了处理来自数据库的数据我实现了表数据网关。所以,我有两张桌子:

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添加一个字段吗?

1 个答案:

答案 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创建缓冲区对象