我有一个jbutton,它在单击时执行一个操作。在actionperformed中,我想在调用notifyobserver之前更新按钮文本,notifyobserver包含大量计算。问题是,在notifyobserver调用的所有操作完成之前,buttontext不会更新。以下是jbutton操作代码:
//Action for sinoButton
sinoButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
sinoButton.setText("Loading Sinogram"); //Set text while loading sinogram
NotifyObserversSinogram(); //Notify observer and start sinogram calculation
}
});
如您所见,应该在通知观察者之前更新按钮文本。有什么办法解决这个问题吗?
4条答案
按热度按时间svgewumm1#
如果
NotifyObserversSinogram()
不执行特定于swing的计算,只需将其放入另一个线程:如果有,请看
SwingWorker
.ifmq2ha22#
编辑由于swing不是线程安全的,因此必须使用swingutilities:
这里有一些关于它如何工作的更完整的信息:swing线程
whhtz7ly3#
swing是一个单线程框架
ActionListener
是在事件调度线程的上下文中执行的,这将阻止在actionPerformed
方法存在现在,您可以使用另一个线程来运行计算,但是swing也不是线程安全的。
一个简单的解决方案是使用
SwingWorker
,这样您就可以安全地更新ui,提供进度更新,并在工作进程停止时收到通知done
有关更多详细信息,请参见swing和worker线程中的并发性以及swingworkeru5i3ibmn4#