SwingUtilities.invokeLater和SwingWorker<Void,Object>之间的区别?



两者之间有什么区别:

    //Some code, takes a bit of time to process
    (new SomeJFrame()).setVisible(true);
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            (new SomeJWindow()).start();//Start a new thread
        }
    });

和:

    class doGraphics extends SwingWorker<Void, Object> {
        @Override
        public Void doInBackground() {
           //Some code, takes a bit of time to process
            (new SomeJFrame()).setVisible(true);
            return null;
        }
        @Override
        protected void done() {
            (new SomeJWindow()).start();//Start a new thread
        }
    }
    (new doGraphics()).execute();

哪种方法更好用?

SwingUtilities.invokeLater 获取一个 Runnable 并稍后在 UI 线程中调用它。通常用于短期运行的 UI 相关工作。

SwingWorker 在非 UI 线程 - 工作线程中运行主要工作。长时间运行的工作完成后,将在 ui 线程(事件调度线程)中调用 done() 方法。

但是 SwingWorker 的 doInBackground() 方法也可以通过调用 publish() 方法发布中间结果。SwingWorker将确保要发布的结果由事件调度线程处理。可以通过实现 process() 方法挂钩。

最新更新