在一個JDialog,當用戶點擊了一個JButton,我想在美國東部時間執行2個GUI操作:我可以在EDT中運行2個GUI操作嗎?
- 顯示另一個小的JDialog在其繁忙的圖標,告訴用戶「請稍候,錯誤處理結束」。
- 在JTable中插入大量記錄。
當我嘗試執行這兩個操作時,「請等待」對話框會按照預期阻止插入過程。
正如你所看到的,這兩項行動都必須在EDT完成...所以是否有解決方案?
在一個JDialog,當用戶點擊了一個JButton,我想在美國東部時間執行2個GUI操作:我可以在EDT中運行2個GUI操作嗎?
當我嘗試執行這兩個操作時,「請等待」對話框會按照預期阻止插入過程。
正如你所看到的,這兩項行動都必須在EDT完成...所以是否有解決方案?
不,這兩個操作都不應該在EDT中執行。
您的記錄不應插入JTable中,而應插入其TableModel中,觸發更新事件。這樣,您可以在顯示對話框時輕鬆更新表格。
更新表模型後,觸發一個事件以確保表被重新繪製,並且它將工作。
第二件事情不需要在EDT中完成。產生線程以將項目添加到JTable的模型,但是該線程偶爾會使用SwingWorker.invokeLater()來觸發「fireTableDataChanged」事件。
你是不是指'SwingUtilities.invokeLater()',這裏是EventQueue.invokeLater()的封面,在以後的評論? – trashgod 2010-06-22 01:11:57
就是這樣。當你完成儘可能多的編程語言和API時,所有名稱都會相互混淆。 – 2010-06-22 02:24:51
大多數TableModels(例如DefaultTableModel)在模型更新後調用fireXXX方法,因此您希望在EDT上完成模型更新,以便表格正確重繪。
「請等待,而錯誤的進程 結束」。
然後根據需要在不鎖定它,你可以更新模型。
這是不正確的。在非EDT線程中更新表模型是標準的,然後使用SwingWorker.invokeLater在EDT中調用「fireTableDataChanged」。 – 2010-06-21 14:55:09
@Paul Tomblin:我認爲@camickr對'DefaultTableModel'的行爲是正確的,但是你對'TableModel'的實際實現是正確的,包括'AbstractTableModel'的具體子類。 – trashgod 2010-06-21 15:33:03
@Paul Tomblin,據我瞭解,MVC模型的職責是在模型中的數據發生變化時通知視圖。我相信JDK中的所有「默認模型」(即JTable,JTree,JList ...的模型)確實會調用已經在相關抽象模型中實現的fireXXX方法。如果你創建一個自定義模型,那麼你可以自由地在模型改變時不通知視圖,但我相信這打破了MVC。 – camickr 2010-06-21 21:44:36
打了我幾秒鐘。 – 2010-06-21 14:55:33
謝謝Riduidel ...保羅,我不知道誰先回答這個問題,所以謝謝你的評論:) – Brad 2010-06-22 09:54:10