8

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

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

调用不会做任何事情,并repaint()在我单击按钮时抛出" " 的结果。JButtonJFrameException in thread "AWT-EventQueue-0" java.lang.NullPointerException

4

2 回答 2

15

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

为了解决这个问题,启动一个SwingWorker做长时间运行的操作;那么你在等待的时候仍然可以在 GUI 中自由地做事情。

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

示例代码

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();
}
于 2009-06-10T19:47:34.323 回答
10

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

解决这个问题的常用方法是将运行时间较长的任务扔到另一个线程中。

这可以很容易地使用SwingWorker.

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

于 2009-06-10T19:46:40.190 回答