这是针对挥杆专家的。我在这个问题上花费了相当多的时间,所以这需要我用几行来解释这个问题。来自EDT问题的Java swing进度条
我有一个独立的java swing应用程序(java 6)。在我的应用程序中,我有一个带有单选按钮组的框架。我有一个单一的动作链接到组中的所有按钮。该操作检查哪些单选按钮被选中并执行一些工作。 “工作”涉及到一些背景计算,以及在我的应用程序中的另外两幅画。后台计算是多线程的。
我想在用户选择其中一个单选按钮时显示一个进度条。 但是,当选择单选按钮时,在单选按钮的动作发生时,进度条从不出现。我试过jdialog类型的进度条,玻璃窗格等等,直到“工作”完成才显示出来。这似乎是因为Swing没有完成绘制单选按钮,直到相应动作中的“工作”完成。而且由于EDT一次只能处理一件事情,因此不会显示进度条对话框(或玻璃窗格)。
然后我尝试使用SwingWorker来完成所有这些“工作”。启动进度条(或激活玻璃窗格),启动SwingWorker并关闭SwingWorker的done()方法中的进度条(或取消激活玻璃窗格)。这似乎可以使进度条看起来很好,但作为“作品”一部分的作品有时并未完成,给我留下了一些绘画工件(paintComponent方法非常复杂,因此不想在此处重现)。如果我调整窗口大小,工件消失。事实上,如果我使用扩展Thread而不是SwingWorker的类,则会发生这种情况。这完全是因为Swing不是线程安全的,而且我正尝试从EDT以外的线程执行GUI工作。我明白那一部分。
我该怎么办? “工作”大约需要30秒,而且如果没有向用户显示程序正在工作的某种迹象,这似乎就太长了。我也尝试将光标更改为等待光标,并遇到与上述相同的问题。我唯一能做的就是禁用该框架,并将该框架的标题设置为“正在工作...”之类的文本。
以前有人看到过这个问题吗?
如何确保EDT在SwingWorker线程的工作完成之前不会执行任何其他绘画? 可以在背景中完成的工作必须在我的框架再次绘制之前完成。 – Anu 2010-08-13 19:41:57
谢谢!我得到了这个工作。 – Anu 2010-08-13 20:31:29