[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 );
として、はまりました。
以上、参考になれば幸いです。