8

シンプルなGUIを作成するために初めてSwingを使用しています。それはJFrame私がシングルを置いたもので構成されてJButtonおり、クリックすると、他のコードを呼び出します。戻るのに3秒。

このコードを呼び出す直前に、でactionPerformed()、ボタンのテキストを更新して、処理が行われていることをユーザーに通知したいと思います。私の問題は、ボタンのテキストが3秒の呼び出しが戻るまで更新されないことです。通話中に更新されたテキストを表示したいのですが、後で元に戻します。

を呼び出しrepaint()JButtonも何も起こらず、ボタンをクリックするとJFrameException in thread "AWT-EventQueue-0" java.lang.NullPointerException」がスローされます。

4

2 に答える 2

15

何が起こっているのかというと、3秒のコードがGUIスレッドで実行されているため、ボタンは完了するまで更新されません。

これを解決するには、aSwingWorkerを開始して長時間実行操作を実行します。そうすれば、それを待っている間もGUIで自由に物事を行うことができます。

これは、このテーマに関するいくつかチュートリアル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();
}
于 2009-06-10T19:47:34.323 に答える
10

ここでの問題は、長時間実行されているタスクが、通常はGUIをペイントするスレッドをブロックしていることです。

これを回避する通常の方法は、実行時間の長いタスクを別のスレッドにスローすることです。

これは、を使用してかなり簡単に実行できますSwingWorker

この質問は、いくつかの役立つ情報も提供する可能性があります。

于 2009-06-10T19:46:40.190 に答える