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 在数据处理期间不更新的主要内容,如果未能解决你的问题,请参考以下文章
使用 Java 在 GUI 编程中混合 awt 和 swing