3

解決したい GUI の問題がありますが、何が起こっているのかわかりません。どなたか説明していただければ幸いです。コードベースは大きすぎてアップロードできませんが、何が起こっているのかを詳しく説明します:

私はスイングを含むクラスを持っていProgessBarます。バーを好みに合わせて変更するためのゲッターとセッターがいくつかありますが、ここで問題が発生します。JDialogJProgressBar

ProgressBar はメソッド内で生成されますmyButtonActionPerformed

myButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                myButtonActionPerformed(evt);
            }
        });

基本的に、ユーザーがこのボタンを押すと、処理が開始され、ProgressBarが生成されます。

現在、ユーザーのJFrame前に があり、このプログレス バーが にポップアップ表示されますJDialog。Netbeans でデバッグ モードをステップ実行した後、 の値が変更されていることがわかりJProgressBarますが、プログラムの処理中にバーが視覚的に 0% のままになり、上記の add アクション リスナー メソッドを離れるとすぐに 100% にジャンプします。そのリスナーから出るまで再描画を待っていた場合。私は何を理解していませんか?myButtonActionPerformed役に立たなくなるまで待つのではなく、このメソッド内で強制的に更新するように呼び出すことができるものはありますか。

4

3 に答える 3

5

EDT で時間がかかることは何でもしていますか? AWT/Swing には GUI 作業 (イベント ハンドラーの処理、GUI の再描画など) を行う専用スレッドがあることに注意してください。そのスレッドで長時間実行される処理を行っても、Swing は再描画しません。

別のスレッドでタスクを実行してみて、それに応じてそこからプログレスバーを更新してください。SwingUtilities.invokeLaterただし、またはを使用invokeAndWaitしてプログレスバーを更新し、EDT で GUI の更新が確実に行われるようにします。そうしないと、事態は非常に奇妙になります。

于 2010-07-01T03:15:23.720 に答える
1

更新されない理由は、処理中の ActionPerformed リスナーで UI スレッドがビジーであるためです。アプリケーションを操作してみると、UI の何も反応しないことに気付くでしょう。

これに対する解決策は、UI スレッドで処理を行わないことです。別のスレッドを起動し、そのスレッドで処理を行い、UI スレッドにコールバックして進行状況バーを更新します。

于 2010-07-01T03:14:45.803 に答える
1

まず、匿名の ActionListener が単に myButtonActionPerformed というメソッドに転送されるため、明らかに問題は投稿されたコードにあるのではなく、myButtonActionPerformed 内で発生する、または発生する原因となる何かにあります。したがって、それが投稿する関連コードになります(可能であれば)。

2 番目の他の人々は、EDT で実際に重い処理が行われている可能性が高いため、おそらくこれを既に釘付けにしています。SwingWorkers を使用して、進行状況/ステータスの更新を適切に GUI スレッドに効率的にルーティングし、バックグラウンド処理を EDT から移動することもできます。

3 番目: 余談ですが、GUI の設計に NetBeans を使用していますか? 私には、自動生成されたコードのように見えます。

于 2010-07-01T03:23:35.567 に答える