- - PR -
JPanelの上に同じサイズのJPanelを貼ると…
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-07-08 18:00
いつもお世話になっております。
JPanelの上に同じサイズのJPanelを貼ると、親JPanelの表示がおかしくなります。 JPanelには同じサイズのJPanelを表示させることはできないのでしょうか? javax.swing.JPanel jre1.6.0_06 / J2ME(AGUI JSR209) Windows XP Professional Version 2002 SP3 具体的には、下のコードで以下の条件で、親JPanelが灰色になります。 子JPanelの幅(CHILD_WIDTH)、高さ(CHILD_HEIGHT)のどちらかを1ピクセルでも 小さくすると親JPanelは描画した色(緑)になります。
| ||||||||||||
|
投稿日時: 2008-07-08 19:12
子のpaintComponent()の先頭にsuper.paintComponent(g);を追加してください。
paintComponent()をオーバーライドしたことで、コンポーネントの描画領域が背景で塗りつぶされなくなったということのようです。 子の方が親とサイズが同じかより大きい場合は、親側が完全に隠れるので親の描画がされずに子の描画がされるために、親の背景色である緑にならないのでしょう。 もし、子を透明なコンポーネントとしたいのであれば、setOpaque(false)としてください。 この場合、親側は子に完全に覆われるとしても透明処理のために自身の描画を行うようです。 | ||||||||||||
|
投稿日時: 2008-07-08 20:37
いつまでたっても日本語ドキュメンテーションはめちゃくちゃ&最悪:
paintComponent()のドキュメンテーション: 英語:if you do not invoker super's implementation you must honor the opaque property, that is if this component is opaque, you must completely fill in the background in a non-opaque color. 日本語: 上位オブジェクトの実装を行わない場合は、不透明プロパティーに注意する必要があります。つまりこのコンポーネントが不透明な場合は、バックグラウンドには不透明でない色を使用する必要があります。 英語には、super.paintComponent()を呼べ、呼ばないなら自分でなんとかしろ、とちゃんと書いてあるのにねー。「上位オブジェクトの実装を行わない場合は、」…どういう意味じゃ? --- それと、何をしたいのかよく分かりませんが、こういう場合はOverlayLayoutを使ったり、あるいはJLayeredPaneを使ってください。nullレイアウトは、インタフェイスの今後のメンテナンスが収拾付かなくなるおそれ大なので、なるべく使わないように。 [ メッセージ編集済み 編集者: ranco 編集日時 2008-07-08 21:09 ] | ||||||||||||
|
投稿日時: 2008-07-08 21:50
お返事が遅くなり失礼いたしました。
まずは、追加情報として画像をアップしました。 http://picasaweb.google.co.jp/abupon/kIiGPE | ||||||||||||
|
投稿日時: 2008-07-08 22:02
nagiseさん、いつも有難うございます。
説明不足で申し訳ございません。 画像を見ていただけますでしょうか。 成功する場合と、失敗する場合の違いはJPanelのサイズのみです。
やってみましたが駄目でした。結果変わらずです。
画面を見て頂ければ…子のほうが塗りつぶしている領域は小さいです。
JPanelの場合はsetOpaque(false)は必要ないようです。 (JavaDocにデフォルト値と書かれていますし、実際そうでした) | ||||||||||||
|
投稿日時: 2008-07-08 22:28
rancoさん、お返事有難うございます。
調査した結果、 paintComponent()とpaint()の違いは、子コンポーネントが描画されるかどうか ということでした。
J2MEと書きましたが、組込みです。 今回は仕様として「絶対レイアウト」が必須となります。 | ||||||||||||
|
投稿日時: 2008-07-09 01:03
child1,child2 を用意して、child1 は緑一色、child2 は水色■
でとりあえず、重ね合わせて表示できましたよ。 登録順序っぽいです。 ※パネルは都合3つになるので全部色変更してやってみました。 第一子〜第N-1子まで 全面描画してない子を登録。 最後の子に親と同じ大きさで背景を描画したものを追加。 最初の子に全面描画のパネルを持ってくるとそれしか表示されない。 ってことは、子供が一杯並ぶ時は登録順序の逆で描画されているってこと。 んーなんだか描画速度向上のための特殊な仕掛けが入っていそうな気配ですね〜。 たぶん、親全面色塗り・第一子部分色塗り・・・を1000ネストくらいしても 初期表示に掛かる時間が提示されたコードとほとんど変わらないような気がします。 未確認ですけど。子の大きさと親の大きさが変わらないなら親書く必要無いじゃん、 な制御が入ってるんじゃないでしょか? zOrder の設定とかもやってみたけど、これはこれで微妙な結果が出ました。 やってみればわかるのでぜひお試しを。 再描画自体が動かなかった・・・・レイアウトマネージャ切っちゃったのが まずいんじゃないかなぁ・・・ 追記:テストコード載せます。最初のコードに若干手入れたもの。 if (true) とこで切り替えて実行してください。
訂正2:■を追加。 [ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-07-09 01:09 ] [ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-07-09 01:23 ] | ||||||||||||
|
投稿日時: 2008-07-09 08:52
> 親JPanelが灰色になります。
これは、子パネルのデフォルトのバックグラウンドです。JPanelはデフォルトではopaque == trueです。 > どちらかを1ピクセルでも > 小さくすると親JPanelは描画した色(緑)になります。 Swingは、このコンポーネントの背後になにかがあるという認識でrepaint()を行い、その際、あなたのコードがopaque == trueのコンポーネントに対してopacity contractを遵守していないので、背景の塗りつぶしを行わないためです。JComponent.paintComponent()のドキュメンテーション(英文)をよく読んでください。(このドキュメンテーションも必読です:http://homepage1.nifty.com/algafield/paint.html) そして、子が親より1ピクセルでも小さいという状態で、子のpaintComponent()の冒頭にsuper.paintComponent(g);を加えてみてください。上の私の文が、よく理解できると思います。 同サイズの状態で、子の背景を透明にするためには、現状のあなたのコードに対し、child.setSize()の直前にchild.setOpaque(false);の1行を追加するだけでOKです。 |