这是给挥杆专家的。我在这个问题上花费了相当多的时间,所以我要花几行来解释这个问题。
我有一个独立的 java swing 应用程序(java 6)。在我的应用程序中,我有一个带有单选按钮组的框架。我有一个链接到组中所有按钮的操作。该操作检查以查看选择了哪个单选按钮并执行一些工作。“工作”涉及一些背景计算以及在我的应用程序中的其他两个框架中的一些绘画。后台计算是多线程的。
当用户选择其中一个单选按钮时,我想显示一个进度条。However, when a radio button is selected, while the action to the radio button is happening, the progress bar never appears. 我尝试过 jdialog 类型的进度条、玻璃窗格等。在“工作”全部完成之前,它们都不会出现。这似乎是因为 Swing 直到完成相应动作中的“工作”才完成单选按钮的绘制。而且由于 EDT 一次只做一件事,因此永远不会显示进度条对话框(或玻璃窗格)。
然后我尝试使用 SwingWorker 来完成所有这些“工作”。启动进度条(或激活玻璃窗格),启动 SwingWorker 并在 SwingWorker 的 done() 方法中关闭进度条(或停用玻璃窗格)。这似乎可以很好地调出进度条,但是作为“工作”的一部分的绘画有时没有完成,给我留下了一些绘画工件(paintComponent 方法相当复杂,所以这里不想重现)。如果我调整窗口大小,工件就会消失。事实上,如果我使用扩展 Thread 而不是 SwingWorker 的类,就会发生这种情况。这完全是因为 Swing 不是线程安全的,我试图从 EDT 以外的线程执行 GUI 工作。我理解那部分。
我该怎么办?“工作”大约需要 30 秒,如果不向用户显示程序正在运行的某种指示,这似乎太长了。我也尝试将光标更改为等待光标并遇到与上述相同的问题。我唯一能做的就是禁用框架并将框架的标题设置为一些文本,如“工作......”
以前有人见过这个问题吗?