2009-07-24 3 views
7

Java Swing UIが更新/再描画されていないと思っていました。アプリはXMPPメッセージを送信し、別のスレッドで応答を受け取ります。その応答が処理され、メッセージに含まれる情報を反映するようにUIが更新されます。応答が受信されるとinvokeLaterを使用した後にスイングUIが更新されない

、私は

javax.swing.SwingUtilities.invokeLater(new Runnable() { 
    public void run() { /* execute logic to update panel */ } 
}); 

を使用してJPanelコンポーネントを更新し、私はJavaで開発されたが、私の研究に基づいてきたので、これはかなりいつかをされているオンラインinvokeLater上で実行するための最大実行可能をキューに入れGUIスレッド。しかし、ウィンドウのサイズ変更など、再描画の原因となるアプリで何かを行うまでは、私のGUIは更新されません。私は何が欠けていますか?パネルを更新するロジックの後、私はinvalidate()とrepaint()のさまざまな組み合わせを試みましたが、結果は同じです。ウィンドウのサイズを変更するまでGUIは更新されません。

EDIT:パネルの更新と言うと、具体的にはremoveAll()を実行してからJLabelを追加しています。

答えて

14

パネルからコンポーネントを追加/削除した後、あなたが使用する必要がありますスイングのために特別に追加されました。

+0

私はこれを数千回更新したいと思います。 – JCasso

2

コンポーネントを追加または削除する「パネルを更新する」ことを意味する場合は、レイアウトマネージャが変更をキャッチするように、invalidate()またはrevalidate()を使用することをお勧めします。

同様の問題については、hereを参照してください。

2

GUIイベント処理(アクションリスナーなど)中にパネルからコンポーネントを追加または削除する場合は、doLayout()を呼び出すと、うまくいけば問題が解決するはずです。 GUIが更新されず、validate()、doLayout()、およびrepaint()を呼び出すと、問題が修正される傾向があることがわかりました。ない)(私は信じて

などのvalidate()、無効()のような

他のものは、AWTから残され

panel.revalidate(); // this works 99% of the time 
panel.repaint(); // sometimes needed. 
日と再検証:

+1

実際にdoLayout()を直接呼び出すことは想定されておらず、代わりにrevalidate()を呼び出す必要があります。 – Stroboskop

+0

@Stroboskopあなたはそうではありませんが、ドキュメンテーションは "これは通常、コンポーネントの検証時に呼び出されます"と述べています。私の経験では、イベント処理中にコンテナからコンポーネントを追加したり削除したりするときに、このメソッドはrevalidate()によって呼び出されないことが示唆されています。 – Peter

+0

右。これはすべてEventQueueで発生するため、完了するまでrevalidateフラグが調べられない可能性があります。しかし、私はrepaint()への呼び出しが後でペイントとレイアウトの両方を引き起こすだろうと推測していたでしょう... – Stroboskop

関連する問題