Swing:无法让JButton更新 - repaint()无效

时间:2009-06-10 19:40:45

标签: java swing repaint swingworker

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

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

repaint()上拨打JButton没有做任何事情,当我点击按钮时,在JFrame上调用它会导致“Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException”被抛出。

2 个答案:

答案 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也可能会提供一些有用的信息。