相同的数据集,两个不同的JTable

时间:2011-12-22 09:21:00

标签: java swing jtable tablemodel

我有一些数据需要通过两个JTable来显示;数据是相同的,但每个表必须以不同的方式显示它。 另外,我从外部连接接收数据(在这种情况下是JMS,但它并不重要,它可能是数据库,或者其他什么)。

由于我是Swing的新手,我仍然对谁应该解雇事件,谁应该听取他们以及如何制作以便修改我的数据集以使两个表都更新而感到有点困惑。

现在,我的数据集结构的一个小例子以及一些虚拟数据:

class Student{ String name; Classroom classroom; boolean goodStudent}
class Classroom{ Sting name; List<String> coursesTaught; List<Student> students;}

public List<Classroom> classes;

基本上,我的数据集将是Controller类中的classes字段,两个JTable必须以不同的方式显示事物。 也就是说,Table1必须显示如下内容:

Classroom Name | Courses
4a             | CS101, CS102, CS103
4b             | BM101, CS102
4c             | I101, CS4100

基本上,对于每个课堂,课程列表。

Table2应该显示如下内容:

Student Name   | Good?
Mark Spencer   | true
Philippe Mann  | true
Tom Sayer      | false

我应该从所有教室看到所有学生。

正如您所看到的,数据是相同的,但它以不同的方式显示。 我想做的是,当我的数据发生变化时,表格也会自动更新。 对于我到目前为止所理解的,我将必须继承AbstractTableModel并为我想要显示的数据类型创建两个不同的TableModel;我没有得到的是:

  • 一旦发生某些变化,模型将如何获取数据?
  • 谁应该通知模特这个变化?
  • 调用“fireTableXXXEvent()”来触发视图刷新是否足够?

我希望自己足够清楚...... 无论如何,非常感谢! 再见

2 个答案:

答案 0 :(得分:4)

@StanislavL对于每个TableModel需要一个JTable是正确的,但没有任何内容表明它们无法从一个普通的抽象父级中获益。在下面的(有点人为的)大纲中,这两个模型共享一个共同的getColumnCount()实现,而具体的孩子实现了剩余的必需TableModel方法。

abstract class SchoolModel extends AbstractTableModel {

    @Override
    public int getColumnCount() { return 2; }
}

class ClassroomModel extends SchoolModel {

    @Override
    public int getRowCount() {…}

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {…}
}

class StudentModel extends SchoolModel {

    @Override
    public int getRowCount() {…}

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {…}
}

答案 1 :(得分:3)

你是对的。你需要2个AbstractTableModels。 假设您将List classesList类列为主数据源。第一个模型行计数将返回列表的size()。第二个将返回每个教室的学生计数总和。两个模型的列数都是2.有趣的方法是getValueAt / setValue,你必须找到合适的行。对于第一个列表,它很容易恰当的列表项。对于第二个表模型,您必须计算正确的行,然后遍历学生列表。 假设在DB中更改了某些内容。您检索新的列表。您可以找到更改的内容,插入/删除/更改了哪些行/列,或者仅更新两个模型中的数据源列表以及触发结构更改事件以使JTable完全刷新内容。 Thre不是模型的自动更新。你可以写例如计时器检查每秒/分钟/小时的更改,或在重新打开显示表格的对话框/框架时刷新。