2015-02-11 61 views
0

Java, How to refresh JTable in one frame from another frame如何按下按鈕時從另一個框架刷新JTable?

How to refresh a JTable after database operations without frame reload?

我知道非常類似的問題已經被問。然而,沒有提供的答案解決了我的問題。

所以我有一個應用程序在Java中處理與幾個數據庫的交互。在程序中,您可以添加記錄,更改Jtable中顯示內容的條件並編輯已存在的記錄(例如,更改客戶端的名稱)。

Screen shot of my program

當我點擊了「升序」複選框,它反轉只是因爲它是應該做的行。

It now orders by ASC not DESC as previously.

所以在這裏作爲我按下上的複選框或任何所示的其他按鈕的JTable中被更新。

當您按下一行時,包含該行更多信息的另一個框架顯示出來。你應該能夠在完成時編輯名稱/設置等等。這是有效的,因爲當我檢查數據庫時,我發現 所做的更改已經應用。同樣,如果我點擊刷新按鈕。

The external frame that is summoned so you can edit the row

然而,當我按下「完成/編輯」了JTable直到我做手工的東西(像的刷新按鈕)更新的。

這裏是在外部JFrame中使用的代碼。

private void AlterTransactionMousePressed(java.awt.event.MouseEvent evt) {            
    EditTransaction(); 

} 


private void EditTransaction(){ 
    GUImannager.RefreshServTable(); 
} 

//In the GUImannager class 

    public static void RefreshServTable(){ 
    System.out.println("RefreshServTable Method has been summoned.\n"); 
    MainGUI.TableRefresher(); 
    //The MainGUI is a static variable which contains the JFrame object of the main frame that is summoned that contains the core of the programs such as the pictures as i used. 
} 

TableRefresher方法與單擊刷新按鈕時使用的方法完全相同。它所做的是啓動一個線程,在此代碼被傳喚。

//Gets the data from the database based on conditions. 
       TableModel model = new DefaultTableModel(TransData, Colnombs); 
      ServiceTable.setModel(model); 
      ServiceTable.revalidate(); 
      ServiceTable.repaint(); 
      TableContainer.setViewportView(ServiceTable); 

而這段代碼無關緊要地工作。但是,無論何時從外部來源召喚它都不起作用。它打印出表明它已被召喚的文本,但它不會在外部召喚時刷新表格,只有當通過相同JFrame中的某些事物(例如「刷新」按鈕)進行召喚纔會起作用。

我試過讓代碼「listnens」改變,然後更新,但雖然這顯然是根據系統召喚出來的,但並沒有以我想要的方式影響程序。

第二個JFrame是在另一個類中,但即使當我把它作爲子類或在同一個文件中它仍然無法工作,所以我懷疑這個問題與處理多個JFrame有關。

我知道這是一個非常複雜的問題,雖然幾乎相同的問題已經被問到,但他們沒有包含任何適合我的答案。

數據是手動檢索,因此該表沒有「綁定」到任何數據庫(這是因爲我在SQLite源和MySQL源之間切換)。

如果有任何更多的信息/代碼是必要的,我會高興地提供它,任何解決這個問題的嘗試將非常感激。如果這是一個簡單的問題,我很抱歉,因爲我還沒有在軟件編程方面獲得那麼多經驗。

誠懇...

//奧維努德斯特倫。

回答

1

該教程說(http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#fire),如果DataModel更改,則必須觸發事件。據我所見,你每次都會製作一個全新的DefaultModel,但這不是解決方案。表格正在等待事件發生改變。就像這樣:

  • fireTableCellUpdated
  • fireTableRowsUpdated
  • fireTableDataChanged
  • fireTableRowsInserted
  • fireTableRowsDeleted
  • fireTableStructureChanged

如果火燒註冊的偵聽器,這些事件中的一個,比你表將顯示正確的值。

我認爲這不是一個兩幀的問題,這是一個不告訴gui(JTable)在更改數據後更新它的問題。也許看看這裏:create TableModel and populate jTable dynamically

+0

我試過使用fireTableDataChanged方法,但它沒有奏效。這是否有什麼區別,我爲此召喚了一條新線索? – 2015-02-11 14:26:18

+0

新線程或新的或另一個JFrame?這是一個區別。如果它只是一個其他的JFrame,根本就沒有任何區別。在您的TableRefresh中,不要創建一個完整的新模型,只需在模型上調用fireTableDataChanged()方法,並且GUI將自行更新(如果模型是JTable的實際基礎模型)。如果它是另一個線程而不是任何副作用可能發生,導致Swing不是線程安全的。但我完全無法告訴你。也許這會幫助你:http://stackoverflow.com/questions/13407418/threads-and-jtable – NwDev 2015-02-11 14:38:43

+0

非常感謝你的努力,但我似乎沒有任何運氣。 – 2015-02-13 10:25:51

相關問題