2

我有一些数据必须通过两个 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;

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

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

所以基本上,对于每个教室,课程列表。

表 2 应该显示如下内容:

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

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

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

  • 一旦发生一些变化,模型将如何获取他们的数据?
  • 谁应该将此更改通知模型?
  • 调用“fireTableXXXEvent()”是否足以触发视图刷新?

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

4

2 回答 2

4

@StanislavL 需要 a TableModelfor each 是正确的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) {…}
}
于 2011-12-22T13:56:20.327 回答
3

你说的对。您需要 2 个 AbstractTableModel。假设您有列表 List classesList classes 作为主要数据源。第一个模型行数将只返回列表的 size()。第二个将返回每个教室的学生人数总和。两个模型的列数都是 2。有趣的方法是 getValueAt/setValueAt 你必须找到合适的行。对于第一个列表,只需适当的列表项即可。对于第二个表模型,您必须计算正确的行,然后遍历学生列表。假设 DB 发生了一些变化。您检索一个新列表。您可以找到更改的内容,插入/删除/更改了哪些行/列,或者只是替换模型中的数据源列表并触发结构更改事件以让 JTable 完全刷新内容。没有自动更新模型。

于 2011-12-22T09:46:33.857 回答