我第一次使用Swing来创建一个简单的GUI。它由一个JFrame
组成,我在其上放置了一个JButton
,当点击它时,会调用一些其他代码,大约需要。 3秒钟返回。
在调用此代码之前,在actionPerformed()
中,我想更新按钮上的文本以通知用户正在进行处理。我的问题是,直到3秒钟的呼叫返回后,按钮上的文字才会更新。我希望在通话过程中出现更新的文本,之后我会将其更改回来。
在repaint()
上拨打JButton
没有做任何事情,当我点击按钮时,在JFrame
上调用它会导致“Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
”被抛出。
答案 0 :(得分:15)
发生的事情是3秒代码在GUI线程中执行,因此按钮在完成之前没有机会更新。
要解决此问题,请启动SwingWorker
以执行长时间运行操作;那么在你等待的时候,你仍然可以自由地在GUI中做事。
以下是关于该主题的couple tutorials,上面引用的SwingWorker
Javadoc也有一些代码。
public void actionPerformed(ActionEvent e) {
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
@Override
public Void doInBackground() {
// Call complicated code here
return null;
// If you want to return something other than null, change
// the generic type to something other than Void.
// This method's return value will be available via get() once the
// operation has completed.
}
@Override
protected void done() {
// get() would be available here if you want to use it
myButton.setText("Done working");
}
};
myButton.setText("Working...");
worker.execute();
}
答案 1 :(得分:10)
这里的问题是你的长时间运行任务正在阻塞通常会绘制GUI的线程。
通常的做法是将更长时间运行的任务抛到另一个线程中。
使用SwingWorker
可以相当轻松地完成此操作。
This question也可能会提供一些有用的信息。