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。因此,正如我发现的那样,任何精心设计的图形用户界面的最重要特征是响应性。

相关问题