2011-07-18 17 views
2

我已經寫了GUI用於操作讀卡器 - 主要由一個ADD按鈕帶來了一個對話框FileChooser和隊列所選File到CardHopper,這在視覺上顯示爲JList的。如何設計也響應後端事件的Java Swing模型?

現在我想爲CPU(另一JFrame,在另一個線程),能夠使讀卡器的要求;例如讀一張卡併發給我。在讀卡器擁有GUI之前,它只是一個與CPU相同的線程運行的模型,所以我可以稱其爲readCard()方法。現在它在一個單獨的線程上,似乎正確的溝通方式是消息傳遞。

我正要實現使用PriorityBlockingQueue的東西,從而使CPU將put隊列和讀卡器讀取卡的命令將take並執行命令,直到我意識到讀卡器線程通常會在某處內阻塞其NetBeans提供的Swing代碼,等待GUI事件,並且無法看到任何事物到達我的事件隊列。而且,這種「後端」請求改變數據模型 - 所以即使我莫名其妙地在模型中執行一些代碼,這將是猶太到「火」通知給GUI的ListDataListeners而GUI等待GUI事件?

我希望這不是太神祕 - 我仍然試圖繞過GUI和線程的機制我的懷裏。

回答

4

當GUI正在等待GUI事件時,向GUI的「觸發」通知ListDataListeners是否會發生?

絕對不是。

你想要做什麼是執行直接操作UI的模型(或稱UI功能)Swing事件線程上的所有任務。

從本質上講,當你準備好後,將執行一些UI任務的情況下,做到這一點,如:

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
    ... 
    } 
} 

您可以觸發所有聽衆,做任何你想你的ListModel(或你的其他UI模型),因爲它只能在Swing線程中運行。

否則,您冒着Swing試圖在繪製數據時讀取數據的風險,並且您正在更新數據。理想情況下,您可以在單獨的線程(或SwingWorker下)中執行所有後臺工作,然後當所有內容都準備就緒後,通過invokeLater推送更新。

+2

+1,'SwingUtilities'是老闆。 :) – Moonbeam

+1

+1 - 執行OP的行爲是Java程序中常見的(所有常見的)問題。請注意,你也可以使用SwingWorker線程類(當然取決於你的Java版本)來做同樣的事情。 – aperkins

+0

值得注意SwingWorker默認從6開始包含,但SwingX爲以前的Java版本提供了一個backport,所以你仍然可以使用它! – berry120