3

啓動應用程序需要5-10秒才能從數據庫檢索初始數據的正確方法是什麼?這是我迄今爲止所得到的,但我不確定沒有更好的方法。我希望GUI和數據庫訪問將位於不同的線程中,以便GUI構建與數據檢索同時發生。啓動Java Swing桌面應用程序的正確方法

public static void main(String[] args) { 
    final Controller controller = new Controller(); 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      View frame = new View(); 
      controller.setView(frame); 
     } 
    }); 
    Model model = new Model(); 
    controller.setModel(model); 
    controller.getInitialData(); 
} 
+3

我不確定我是否明白問題所在。您需要設計GU​​I,以便在完成數據庫訪問時對模型中的更改做出反應。同樣,'JTable'監聽來自'TableModel'的事件,你的整個UI應該監聽來自模型的事件(比如「完成DB訪問」)。 – Darien

+3

在GUI啓動之前,您可以在加載數據時顯示[啓動畫面](http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/splashscreen/)。否則,您也可以啓動GUI,凍結它並在加載數據時顯示一些消息。 – toto2

+2

是的,絕對要在單獨的線程中完成數據庫工作。我會想象你的getInitialData方法體將創建一個SwingWorker並從SwingWorker內部獲取數據本身,然後如上述註釋中所述,在此操作完成時通知GUI。 –

回答

8

你在正確的軌道上排序。希望這會讓事情變得更加清晰...

Swing不是線程安全的。這就是說,你可以做一些事情。一種選擇是使用SwingUtilities在要執行的事件分派線程上發佈Runnable任務。這將使您能夠從數據庫中檢索數據,並在尊重Swing的單線程模型的同時在單獨的線程中更新UI。

SwingUtilities.invokeLater(new Runnable(){ 
    @Override 
    public void run(){ 
     // update UI 
    } 
}); 

另一種選擇,因爲這是一個長時間運行的任務,就是用SwingWorker提供更新的用戶界面或者完成時,或在處理。

正如你所看到的,在EventQueue這些機制(即SwingUtilitiesSwingWorker)使您能夠奉獻這樣的任務分派給其他線程同時爲您提供放置結果(通常轉化爲行動的能力)的以後(和安全)執行。無論您選擇哪一個,重要的是要記住長期運行的任務不應該發生在EDT。因此,正如我發現的那樣,任何精心設計的圖形用戶界面的最重要特徵是響應性。

相關問題