簡體   English   中英

相同的數據集,兩個不同的JTable

[英]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。 我不明白的是:

  • 一旦發生某些變化,模型將如何獲取其數據?
  • 誰應將此更改通知模型?
  • 調用“ fireTableXXXEvent()”足以觸發視圖刷新是否足夠?

我希望我已經足夠清楚了……無論如何,非常感謝! 再見

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM