[英]Java: Display two different JTables which are created from the same AbstractTableModel
[英]Same dataset, two different JTables
我必須通過兩個JTables顯示一些數據。 數據是相同的,但是每個表的顯示方式必須有所不同。 另外,我從外部連接接收數據(在這種情況下為JMS,但這並不重要,它可以是DB,也可以是其他任何東西)。
由於我是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必須以不同的方式顯示事物。 即,表1必須顯示類似以下內容:
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。 我不明白的是:
我希望我已經足夠清楚了……無論如何,非常感謝! 再見
@StanislavL對於每個JTable
需要一個TableModel
是正確的,但是沒有任何東西說它們不能有效地派生自一個常見的抽象父級。 在下面的(有些人為設計的)概述中,兩個模型共享一個通用的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) {…}
}
你是對的。 您需要2個AbstractTableModels。 假設您具有列表列表類別列表類別作為主要數據源。 第一個模型行計數將僅返回列表的size()。 第二個將返回每個教室的學生計數總和。 兩種模型的列數均為2。有效的方法是getValueAt / setValueAt,您必須找到適當的行。 對於第一個列表,只需要適當的列表即可。 對於第二個表格模型,您必須計算適當的行,然后遍歷學生列表。 假設數據庫中有一些更改。 您檢索一個新的列表。 您可以找到更改內容,插入/刪除/更改了哪些行/列,或者只是替換兩個模型中的數據源列表,並觸發結構更改事件以讓JTable完全刷新內容。 這不是自動更新模型。 您可以編寫例如計時器來檢查每秒鍾/分鍾/小時的更改,或者在重新打開顯示表格的對話框/框架時刷新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.