2011-12-22 76 views
2

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

因为我是Swing的新手,我仍然有点困惑谁应该开火的事件,谁应该听他们,以及如何使我的数据集的修改我将有两个表更新。

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

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

public List<Classroom> classes; 

基本上,我的数据集将在控制器类classes场和两个JTable中必须显示的东西不同的方式。 也就是说,表1将有显示类似:

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()”触发视图刷新就足够了吗?

我希望自己明白了...... 无论如何,非常感谢! 再见

回答

3

你说得对。你需要2个AbstractTableModels。 假设您有List List classes类作为主数据源。第一个模型行数将返回列表的大小()。第二个将返回每个教室的学生总数。这两种模型的列数是2. inteeresting方法是getValueAt/setValueAt必须找到适当的行。对于第一个列表来说,只需要适当的列表项即可。对于第二个表模型,您必须计算正确的行,然后遍历学生列表。 假设DB中的内容发生了变化。您检索一个新的列表。您可以查找更改内容,插入/删除/更改哪些行/列,或者只是替换两个模型中的数据源列表以及激发结构更改的事件,以使JTable完全刷新内容。 Thre没有自动更新模型。你可以编写例如定时器每秒钟/分钟/小时检查更改,或在重新打开显示表格的对话框/框架时刷新。

+0

为什么2?如果你只是使用相同的tablemodel的2不会工作吗? – Peter 2011-12-22 10:43:30

+1

@彼得,他们有不同的行数 – StanislavL 2011-12-22 14:15:49

+0

对不起,错过了那部分 – Peter 2011-12-22 14:25:58

4

@StanislavL对于每个JTable需要一个TableModel是正确的,但没有说他们不能从一个共同的抽象父母有用地下降。在下面的(稍微设计)轮廓中,这两个模型共享一个共同的实现,而具体的孩子实现了剩余的所需方法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) {…} 
} 
相关问题