2011-12-22 85 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) {…} 
} 
相關問題