我遇到问题,当程序繁忙时,我的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
答案 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线程示例。