Swing:无法让JButton更新 – repaint()无法正常工作

我第一次使用Swing来创建一个简单的GUI。 它由一个JFrame组成,我在其上放置了一个JButton ,当单击它时,调用一些其他代码需要大约。 3秒钟返回。

就在调用此代码之前,在actionPerformed() ,我想更新按钮上的文本以通知用户正在进行处理。 我的问题是,直到3秒钟的呼叫返回后,按钮上的文字才会更新。 我希望在通话过程中出现更新的文本,然后我会将其更改回来。

JButton上调用repaint()不会做任何事情,并且在JFrame上调用它会导致“ Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException中的Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException当我单击按钮时抛出Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException ”。

发生的事情是3秒代码在GUI线程中执行,因此按钮在完成之前没有机会更新。

要解决此问题,请启动SwingWorker以执行长时间运行操作; 那么你在等待它时仍然可以自由地在GUI中做事。

这里有几个关于这个主题的教程 ,上面引用的SwingWorker Javadoc也有一些代码。

示例代码

 public void actionPerformed(ActionEvent e) { SwingWorker worker = new SwingWorker() { @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(); } 

这里的问题是你的长时间运行任务正在阻塞通常会绘制GUI的线程。

通常的做法是将更长时间运行的任务抛到另一个线程中。

使用SwingWorker可以相当容易地完成此操作。

这个问题也可能提供一些有用的信息。