2012-04-18 18 views
0

多くのチュートリアル、記事、質問を読んでいますが、私はまだGUIの更新に関する混乱があります。さらに、私の問題は非常にシンプルだとは思うが、このウェブサイトには多くの関連する質問があり、まだ運がない。JFrameの実行中にJLayeredPaneを更新する方法は? java

基本的には、ルートコンテナとしてJLayeredPaneを持つJFrameがあります。そして私はそこにJPanelsのいくつかの層を持っています。

主な問題は、このJLayeredPane内の特定のJPanelを更新することです。そしてこの特定のパネルでは、内部の内容を変更する更新メソッドを実装しました。

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() 

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

ありがとうございます。

+0

質問と回答http://stackoverflow.com/questions/9885855/how-to-dynamically-add-jbutton-to-jpanel/9885927#9885927便利かもしれません – Robin

答えて

2

基本的には二つの方法が必要です(私はちょうどスレッドスイング、それを呼び出します。この方法は、(無効化と同じ処理を行い

再検証()

を)が、AWTイベントにディスパッチスレッド後で))。コンテナとそのすべての祖先(このコンテナが配置されている親コンテナ)のレイアウトを更新します。

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

再描画は、()

この方法力成分と、そのすべてのサブコンポーネントは、親コンテナ(それはそれらを持っている場合)(基本的にはこのコンポーネントが不透明されていない場合)は、「絵」であるかを更新します。

通常、すべての標準Swingコンポーネントは、いつ再描画するのかを知っているので、独自の方法でコンポーネントのUIやその他のものに依存しますので、このメソッドは必要ありません。このメソッドは、固有の塗装方法(コンポーネントに対するカスタム選択など)と、標準コンポーネントではまれな問題のあるケースで独自のコンポーネントがある場合に役立ちます。

また、Swingペイントの最適化により、コンポーネントの配置に依存します - 大規模な再塗りつぶしがある場合は、実際に必要な部分(矩形)のみを再描画する方がよいでしょう。再塗りつぶし。たとえば、任意のコンテナ内のコンポーネント境界を変更する場合は、古い境界矩形を再描画するか、新しい境界rectを再描画するか、または両方の境界を含むrectを再描画するか、アクションコンポーネントで再描画されないようにする。

したがって、パネルを使っていくつかの変更を加えた後は、コンテナのrevalidate(または無効化)を呼び出してから、再描画(再検証によっていくつかの視覚的なアーティファクトを残します)

ゲス私は何も逃さなかったと私は今あなたがこれらのメソッドの基本的な意味を知っていることを願っています。

0

のように、更新メソッドの最後に再検証してください。

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

} 
関連する問題