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

时间:2014-06-06 14:21:46

标签: java swing user-interface label components

我遇到问题,当程序繁忙时,我的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

2 个答案:

答案 0 :(得分:3)

  

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

这是因为您正在Event Dispatch Thread (EDT)上执行长时间运行的任务,并且GUI无法重新绘制自己,直到任务完成执行。

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

答案 1 :(得分:1)

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

创建一个线程调度程序类并从主类

中调用它
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线程示例。