启动JavaSwing桌面应用程序的正确方法

启动JavaSwing桌面应用程序的正确方法,java,multithreading,model-view-controller,swing,user-interface,Java,Multithreading,Model View Controller,Swing,User Interface,启动需要5-10秒从数据库检索初始数据的应用程序的正确方法是什么?这就是我到目前为止所得到的,但我不确定是否有更好的方法。我希望GUI和数据库访问将在不同的线程中进行,以便GUI构建与数据检索同时进行 public static void main(String[] args) { final Controller controller = new Controller(); SwingUtilities.invokeLater(new Runnable() {

启动需要5-10秒从数据库检索初始数据的应用程序的正确方法是什么?这就是我到目前为止所得到的,但我不确定是否有更好的方法。我希望GUI和数据库访问将在不同的线程中进行,以便GUI构建与数据检索同时进行

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();
}

你说得对。希望这能让事情变得更清楚一点

Swing不是线程安全的。也就是说,你可以做几件事。一个选项是用于在要执行的事件调度线程上发布
Runnable
任务。这将使您能够从数据库中检索数据,并在一个单独的线程中更新UI,同时考虑Swing的单线程模型

SwingUtilities.invokeLater(new Runnable(){
    @Override
    public void run(){
        //  update UI
    } 
});
由于这是一项长期运行的任务,因此另一个选项是在完成时或在处理时使用提供UI更新


如您所见,这两种机制(即
SwingUtilities
SwingWorker
)使您能够将此类任务专用于其他线程,同时使您能够将结果(通常转换为操作)放在
EventQueue
上,以便以后(安全)执行。无论您选择哪一种,重要的是要记住,长时间运行的任务决不能在
EDT
中进行。因此,正如我逐渐发现的那样,任何设计良好的GUI最重要的功能都是响应能力。

我不确定自己是否理解问题所在。您需要设计GUI,以便在数据库访问完成时它能够对模型中的更改作出反应。与
JTable
侦听来自
TableModel
的事件的方式相同,您的整个UI应该侦听来自模型的事件(如“DB access done”)。您可以在加载数据时,在GUI出现之前,显示一个。否则,您也可以启动GUI,冻结它,并在加载数据时显示一些消息。我可以想象,您的getInitialData方法主体将创建一个SwingWorker,并从SwingWorker内部获取数据本身,然后如上面的注释所述,在该操作完成时通知GUI。所有这些都是非常好的建议。