小编Mil*_*Mil的帖子

使用invokeLater或SwingWorker从另一个线程更新Swing组件

我正在开发一个小应用程序,它将具有Swing GUI.App正在另一个线程中执行IO任务,当该线程完成GUI时,应该相应地更新以反映线程的操作结果.在(工作者,非GUI)中运行的类具有在构造函数中传递给它的对象,该对象将用于更新GUI,因此我不需要将GUI内容放在非GUI类中,而是传递对象以更新GUI那个班.据我所知,这里的形式阅读,(线程/摆动)更新(更改)Swing GUI的安全选项将是使用javax.swing.SwingUtilities.invokeLater(),javax.swing.SwingUtilities.invokeLaterWait()和/或javax.swing.SwingWorker()基本上做同样的事情.

Swing的所有线程问题对我来说有点混乱,但我需要使用线程在GUI应用程序中做任何有意义的事情而不是在EDT中处理时挂起GUI,所以我现在感兴趣的是:

  1. 是否invokeLater并且invokeLaterWait喜欢向EDT发送消息并等待它完成处理该呼叫之前的消息时执行此操作?

  2. 从Swing线程安全方面是否正确,做这样的事情:

    interface IUPDATEGUI {  
      public void update();  
    }  
    
    // in EDT/where I can access components directly    
    class UpdateJList implements IUPDATEGUI {    
      public void update() {    
        // update JList...    
        someJList.revalidate();    
        someJList.repain();    
      }    
    }    
    
    class FileOperations implements Runnable {  
      private IUPDATEGUI upObj;  
      List<File> result = new ArrayList<File>; // upObject is accessing this  
    
      public void FileOperations(IUPDATEGUI upObj) {
        this.upObj = upObj;
      }
    
      private void someIOTask() {
        // ... …
    Run Code Online (Sandbox Code Playgroud)

java swing multithreading

7
推荐指数
2
解决办法
1万
查看次数

标签 统计

java ×1

multithreading ×1

swing ×1