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

ban*_*cer 3 java model-view-controller user-interface swing multithreading

启动应用程序需要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();
}
Run Code Online (Sandbox Code Playgroud)

mre*_*mre 8

你正处于正确的轨道上.希望这会让事情变得更加清晰......

Swing不是线程安全的.话虽这么说,你可以做几件事.一种选择是用于在要执行的事件调度线程上SwingUtilities发布Runnable任务.这将使您能够从数据库中检索数据并在单独的线程中更新UI,同时遵循Swing的单线程模型.

SwingUtilities.invokeLater(new Runnable(){
    @Override
    public void run(){
        //  update UI
    } 
});
Run Code Online (Sandbox Code Playgroud)

另一个选项,因为这是一个长期运行的任务,用于SwingWorker在完成或处理时为UI提供更新.

正如您所看到的,这两种机制(即SwingUtilitiesSwingWorker)使您能够将此类任务专用于其他线程,同时使您能够将结果(通常转换为操作)放在EventQueue以后(并安全)执行上.无论你选择哪一个,重要的是要记住长期运行的任务永远不应该发生在EDT.因此,正如我所发现的,任何精心设计的GUI的最重要特征是响应性.