プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

親コンポーネントは描画されるとは限らない

ところで、先ほどの間違ったソースを実行すると結果の様に表示されるのは一瞬で、次からはこんな風にきちんと描画されていたりしませんか?
 

(何故か正しく描画される間違ったソースの図)

 
場合によっては最初からこう描画されるかも知れません。
何故なんでしょうか?
 
JPanel,JButtonのpaint関数とpaintComponent関数をオーバーライドして、今自分が実行されたことを教えて貰うためにSystem.out.printlnを追加してみます。
すると、結果はこんな感じになりました
 
JPanel paint
JPanel paintComponent
JButton paint
JButton paintComponent
JPanel paint
JPanel paintComponent

JButton paint
JButton paintComponent
JButton paint
JButton paintComponent
JButton paint
JButton paintComponent
……
あるぇ?(´・ω・`)
 
JPanelのpaint関数の呼び出しに対してJButtonの呼び出し回数がおかしいことになっています。
 
これはSwingの機能で、描画を高速にするために一番上にある(と思われる)コンポーネントのみを再描画するのです。
この時親コンポーネント達のpaint関数は呼ばれません。
透明度を設定するJPanelのpaintComponentが呼び出されないので、その下のコンポーネントのJButtonに透明度の情報が伝わらなくなったのです。
これを親コンポーネントから描画させる様にするのはまた今度の機会に。
 
JAVAで描画するとき、必ず下から描画が呼び出されるわけではないと言う事を頭の片隅に置いておいて下さい。