0

多くのチュートリアル、記事、質問を読んでも、GUI の更新についてまだ混乱しています。さらに、この Web サイトには関連する質問が数多くありますが、まだ運がありません。私の問題は非常に単純だと思いますが。

基本的に、ルートコンテナとして JLayeredPane を持つ JFrame があります。そして、その中にJPanelのレイヤーがいくつかあります。

主な問題は、この JLayeredPane で特定の JPanel を更新することです。そして、この特定の Panel に対して、内部のコンテンツを変更する update メソッドを実装しました。

updatePanel(int para)
//doesn't remove this panel
//removes some existing labels and replaces it with new ones

フレーム全体を作成したら、明らかにこのメソッドを呼び出すだけでは、フレームに表示される変更は表示されません。

private void static main (String[] args){
    WindowFrame frame = new WindowFrame()//WindowFrame extends JFrame
    frame.updatePanel(2);
    .....
    .....
}

そして、それが私が立ち往生しているところです。フレームが表示されたまま内容を更新したい。

これらの方法について人々が言及しているのを見ましたが、問題の性質上、概念を完全に把握することはできませんでした。さらに、これらの方法に関するドキュメントは、少なくとも私にとっては役に立ちません。

revalidate()
validate()
repaint()

これらのメソッドはいつどのように呼び出す必要がありますか? それとも、これらの方法と私が解決しようとしている問題を考えると、これは私がすべきことの正しい方法ではありませんか?

お時間をいただきありがとうございます。

4

2 に答える 2

2

基本的に、次の 2 つの方法が必要です。

再検証()

このメソッドは、invalidate() と同じことを行いますが、AWT イベント ディスパッチ スレッドで実行されます (後で Swing スレッドと呼びます)。コンテナとそのすべての祖先 (このコンテナが配置されている親コンテナ) のレイアウトを更新します。

基本的に、このコンテナー内で何かを移動したり、その中にコンポーネントを配置/削除したりする場合は、このメソッドを呼び出す必要があります (または、Swing スレッドで実行している場合は無効にします。たとえば、マウス/アクション リスナーの本体内または内部のみ)。

再描画()

このメソッドは、コンポーネント、そのすべてのサブコンポーネント (サブコンポーネントがある場合)、および親コンテナー (基本的に、このコンポーネントが不透明でない場合) に、それらが「描画」しているものを更新することを強制します。

通常、このメソッドは必要ありません。すべての標準 Swing コンポーネントはいつ自分自身を再描画するかを認識しており、独自に再描画するためです (もちろん、コンポーネントの UI やその他の要素に依存します)。この方法は、独自の特定のコンポーネントを独自のペイント方法 (コンポーネントのカスタム選択など) で使用している場合や、標準コンポーネントでまれに問題が発生する場合に役立ちます。

また、このメソッドが動作する方法は、コンポーネントの配置によって異なります (いくつかの Swing ペインティングの最適化による) - 大量の再ペイントが行われている場合は、実際に再ペイントする必要がある部分 (四角形) のみを再ペイントするように最適化することをお勧めします。たとえば、コンテナ内のコンポーネントの境界を変更する場合、古い境界 rect と新しい境界 rect を再描画するか、コンテナ全体ではなく、両方の境界を含む rect を再描画して、アクション コンポーネントに関与しない再描画を回避するのが最善の選択です。

したがって、基本的に、パネルでいくつかの変更を行った後、コンテナーの再検証 (または無効化) を呼び出してから、コンテナーの再描画 (再検証によって視覚的なアーティファクトが残る場合) を再度行う必要があります。

これらのメソッドの基本的な意味を理解していただければ幸いです。

于 2012-04-19T00:04:52.470 に答える
0

このように、更新メソッドの最後で再検証します。

updatePanel(int para){
 .....
 .....
 this.revalidate();  //of course this refer to the panel
 parent.revalidate(); // parent refer to the window

 }
于 2012-04-18T23:55:12.243 に答える