Swing GUI 在数据处理期间不更新

Posted

技术标签:

【中文标题】Swing GUI 在数据处理期间不更新【英文标题】:Swing GUI doesn't update during data processing 【发布时间】:2014-07-27 20:35:28 【问题描述】:

我遇到了一个问题,我的 Swing GUI 组件在程序繁忙时没有为我更新。我正在创建一个图像编辑器,在进行繁重的处理时,我尝试更改“状态”标签,同时让用户了解正在发生的事情。但是,标签在处理完成之前不会更新。

如何立即更新标签而不必等待?顺便说一句,我的标签都在 JPanel 上。

直到 for 循环和以下方法完成后,我的标签才被设置。

 labelStatus.setText("Converting RGB data to base 36...");

                            for (int i = 0; i < imageColors.length; i++) 
                                for (int j = 0; j < imageColors[0].length; j++) 
                                    //writer.append(Integer.toString(Math.abs(imageColors[i][j]), 36));
                                    b36Colors[i][j] = (Integer.toString(Math.abs(imageColors[i][j]), 36));
                                
                            
                            String[][] compressedColors = buildDictionary(b36Colors);//CORRECTLY COUNTS COLORS

【问题讨论】:

【参考方案1】:

我遇到了一个问题,我的 Swing GUI 组件在程序繁忙时没有为我更新。

那是因为您正在Event Dispatch Thread (EDT) 上执行一个长时间运行的任务,并且在任务完成执行之前,GUI 无法重新绘制自身。

您需要在单独的线程或 SwingWorker 中执行长时间运行的任务(以获得更好的解决方案)。阅读 Concurrency 上的 Swing 教程部分,了解有关 EDT 的更多信息以及使用 SwingWorker 来防止此问题的示例。

【讨论】:

我不能只“更新 GUI”,然后进行处理?如果我可以在不使用多线程的情况下做到这一点,那就太好了 阅读教程。如果您想使用 Swing,您需要了解为什么这很重要。创建 SwingWorker 只需几行额外的代码。下载示例代码并进行测试。【参考方案2】:

你可以做这样的事情,不是最好的,但它可以给你一些想法

创建一个线程调度器类并从主类调用它

public class ThreadDispatcher implements Runnable  

public ThreadDispatcher() 



public void run() 

        //call the method related heavy process here 

         

  

你的主班可能是这样的

 Thread thread = new Thread(new ThreadDispatcher());
 thread.start();
 sleep(100);

捕获 InterruptedException ex.

并检查 Java 线程示例。

【讨论】:

以上是关于Swing GUI 在数据处理期间不更新的主要内容,如果未能解决你的问题,请参考以下文章

在长时间处理期间与 GUI 交互

使用 Java 在 GUI 编程中混合 awt 和 swing

Swing GUI 客户端侦听器未响应远程 RMI 属性的更新

强制 Java 刷新 Java Swing GUI

在插槽运行期间刷新/更新 GUI

Swing:不使用 EDT 创建 GUI 是不是安全? [复制]