2011-11-05 92 views
1

我正在製作一個應用程序,允許用戶查看存儲在不同數據庫中的任務列表。那麼會發生什麼呢,我有一個可瀏覽數據庫的名稱列表(存儲爲一個文本文件)。程序加載列表中的第一個數據庫並顯示內容。然後從菜單中,我允許用戶在列表中選擇另一個數據庫。 (有點像,我想看看安迪的任務,現在鮑勃,現在卡爾......)。獲取Runnable的當前實例

問題是,我不知道如何更新UI,以便顯示新數據庫的內容。刪除當前列出的任務,從數據庫讀取,然後重新填充是很簡單的。但我無法得到此代碼(來自我的Singleton數據庫驅動程序),因爲我需要訪問已加載到EventQueue的Runnable實例(我的所有JComponents都是私有的,就像我迄今遇到的所有教程一樣)。我正在查看EventQueue中的get/peek方法,但它們似乎並不是我需要的,因爲它們返回AWTEvents,並且除了java.lang.Object之外,我沒有看到AWTEvent和Runnable之間的任何關係。

那麼,是否有可能獲得當前的Runnable?怎麼樣?

在此先感謝您的任何指導。

+1

我認爲你可能會出現這個錯誤。我不認爲有必要嘗試獲取對「Runnable」的引用。沒有意義。您的Swing GUI不能訪問數據庫驅動程序代碼嗎?這不會在你的程序的控制類中被調用嗎? –

回答

2

更多的細節我懷疑你會約個是錯的。你想要做的是從控制類中改變數據庫(使用MVC命名法)。例如,假設您將可用數據庫加載到JList中,然後在該組件的控件(比如ListSelectionListener)中執行SwingWorker,該SwingWorker加載新數據庫,然後通過其發佈/處理對方法或完成的方法。數據庫代碼(模型)應該對你的代碼的視圖或GUI部分一無所知(可以稱之爲Runnable)。

+1

謝謝鰻魚。在閱讀你對我的問題的評論之後,我重新考慮了一下,只是我花了很多時間纔得到一個更清晰的解決方案。我將數據庫類設爲Observable,然後將Runnable作爲觀察者(當然,它觀察數據庫類)!所以,無論何時數據庫切換,Runnable都會收到通知,並自動刷新。我不確定它是否是最乾淨的解決方法,但嘿它有效(現在至少沒有問題)。再次謝謝你。 – skytreader

3

有一個很好的教程有關Concurency in Swing,沒有人不知道這件事,是過時

你有兩個,選項

1)Runnable#Thread,但所有輸出到GUI必須包裝爲invokeLater(),在教程的Concurency in Swing

2)或使用SwingWorker