2010-06-21 46 views
1

在一個JDialog,當用戶點擊了一個JButton,我想在美國東部時間執行2個GUI操作:我可以在EDT中運行2個GUI操作嗎?

  1. 顯示另一個小的JDialog在其繁忙的圖標,告訴用戶「請稍候,錯誤處理結束」。
  2. 在JTable中插入大量記錄。

當我嘗試執行這兩個操作時,「請等待」對話框會按照預期阻止插入過程。

正如你所看到的,這兩項行動都必須在EDT完成...所以是否有解決方案?

回答

3

不,這兩個操作都不應該在EDT中執行。

您的記錄不應插入JTable中,而應插入其TableModel中,觸發更新事件。這樣,您可以在顯示對話框時輕鬆更新表格。

更新表模型後,觸發一個事件以確保表被重新繪製,並且它將工作。

+1

打了我幾秒鐘。 – 2010-06-21 14:55:33

+0

謝謝Riduidel ...保羅,我不知道誰先回答這個問題,所以謝謝你的評論:) – Brad 2010-06-22 09:54:10

1

第二件事情不需要在EDT中完成。產生線程以將項目添加到JTable的模型,但是該線程偶爾會使用SwingWorker.invokeLater()來觸發「fireTableDataChanged」事件。

+0

你是不是指'SwingUtilities.invokeLater()',這裏是EventQueue.invokeLater()的封面,在以後的評論? – trashgod 2010-06-22 01:11:57

+0

就是這樣。當你完成儘可能多的編程語言和API時,所有名稱都會相互混淆。 – 2010-06-22 02:24:51

1

大多數TableModels(例如DefaultTableModel)在模型更新後調用fireXXX方法,因此您希望在EDT上完成模型更新,以便表格正確重繪。

「請等待,而錯誤的進程 結束」。

使用的indeterminate JProgressBar

然後根據需要在不鎖定它,你可以更新模型。

+0

這是不正確的。在非EDT線程中更新表模型是標準的,然後使用SwingWorker.invokeLater在EDT中調用「fireTableDataChanged」。 – 2010-06-21 14:55:09

+0

@Paul Tomblin:我認爲@camickr對'DefaultTableModel'的行爲是正確的,但是你對'TableModel'的實際實現是正確的,包括'AbstractTableModel'的具體子類。 – trashgod 2010-06-21 15:33:03

+0

@Paul Tomblin,據我瞭解,MVC模型的職責是在模型中的數據發生變化時通知視圖。我相信JDK中的所有「默認模型」(即JTable,JTree,JList ...的模型)確實會調用已經在相關抽象模型中實現的fireXXX方法。如果你創建一個自定義模型,那麼你可以自由地在模型改變時不通知視圖,但我相信這打破了MVC。 – camickr 2010-06-21 21:44:36

相關問題