[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] Re: [jfriends] Re: 動的にコンポーネントを追加する




いしがみ です。


1 週間ほど前から本メーリングリストに参加しています。
よろしくお願いします。

revalidate() は、JComponent のメソッドなので Swing のコンポーネントに
対して使用できるメソッドです。repaint() する際には、再描画させたい
コンポーネントに対して revalidate() しておく必要があります。


> フレームに対してのinvalidate()と
> ボタンに対してのreinvalidate()はどちらを選択したほうがよいのでしょうか?

revalidate() は、再描画させたいコンポーネント、および、再描画させたい
コンポーネントが保持するコンポーネントを、再描画の対象とします。

サンプルプログラムでは、再描画の対象は bot ( JButton コンポーネント ) だけ
なので、ContentPane に対してでも JButton に対してでもどちらでも
良いと思います。

ただし、例えば、JButton を 2 つ追加した場合などは、2 つのボタンに対して
revalidate() をしなければなりません。その際には、ContentPane に対して
revalidate() を 1 回だけすれば良いはずです。

私は、revalidate() は Swing Connection の Threads and Swing のページ
http://java.sun.com/products/jfc/tsc/archive/tech_topics_arch/threads/threads.html
で知りました。

ちなみに、余談ですが「動的にコンポーネントを削除する」場合には、
removeBot を削除したいコンポーネントを指すオブジェクトとすると、

getContentPane().remove( removeBot );

としてあげなくては行けません。これは、Swing の Window が
http://java.sun.com/products/jdk/1.2/ja/docs/ja/api/javax/swing/JRootPane.html
のような構造になっているからです。( getContentPane#add してるんだから
あたりまえだろうけど )。私は、以前、単に

remove( removeBot );

として、はまりました。

以上、参考になれば幸いです。