• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:JOptionPaneのダイアログパネルの背景色の変え方)

JOptionPaneのダイアログパネルの背景色の変え方

このQ&Aのポイント
  • JavaのJOptionPaneを使用してダイアログの背景色を変更する方法を教えてください。
  • JOptionPaneではパネル背景色が変えられないのか疑問に思っています。
  • 望む結果は、パネルの背景色が白になり、文字色が赤であることです。

質問者が選んだベストアンサー

  • ベストアンサー
  • mojimojio
  • ベストアンサー率51% (14/27)
回答No.1

APIドキュメントに書いてあるように、JOptionPaneは標準のダイアログを簡単に表示するためのものなので、カスタマイズしたダイアログを表示したい場合には、自前でコンポーネントを組み立てるのが良いと思います。 また、コンポーネントの色など見た目の設定については本来、独自のLookAndFeelを記述するのがスマートなやり方ですね。いちいちsetXXXColorでやっていると、全コンポーネントの色を変えようと思ったときに大変なことになります。 JOptionPaneで色を変えることができないわけではありません。 yojisktさんのプログラムでうまくいかなかったのは、Container(JOptionPaneはContainerの派生クラス)の中に含まれるComponentの色を変更していなかったからです。 以下のサンプルプログラムでは、内部に含まれるコンポーネントの色を再帰的にムリヤリ設定するようにしています。 実際にはこんなことをすべきでないと思いますが、何かの参考にしてもらえれば幸いです。 public static void main(String[] args) { JOptionPane pane = new JOptionPane("ほげほげ", JOptionPane.WARNING_MESSAGE); JDialog dialog = pane.createDialog(null, "タイトル"); setComponentColorRecursively(dialog, Color.red, Color.white); dialog.show(); } static void setComponentColorRecursively(Component c, Color fore, Color back) { if (c instanceof Container) { Component[] components = ((Container)c).getComponents(); for (int i = 0; i < components.length; i++) { setComponentColorRecursively(components[i], fore, back); } } c.setForeground(fore); c.setBackground(back); }

yojiskt
質問者

お礼

ありがとうございました。(^^ 正しく動作しました。これで、中途半端でなく、希望する形に出来上がりました。 大変申し訳ないのですが、ソースの解説をお願いします。 粗方はわかるのですが、もう一歩入って、教えて頂きたいのです。 手が空いたときでも結構ですので、よろしくお願いします。 (_ _)<< 質問) 1、Component[] components = ((Container)c).getComponents(); 本記述はパネルが複数個存在することを考慮して、記述していると思います。そのパネルはどことどこのパネルを指しますか。 今、作成しているプログラムはJFrameからJOptionPaneを表示させる形です。 Components[]とforの間にcomponents.lengthの値を印字命令を入れて印字すると「1,2,0,1,1,2,2,2,0,1,0,0,1,0」の値になりました。 例えば、1枚目はJFrame、2枚目はJOptionPane指しますとか 2、1の続きでcomponents.lengthの値が変化するのは何故ですか

その他の回答 (1)

  • mojimojio
  • ベストアンサー率51% (14/27)
回答No.2

再び失礼します。 mainの方で dialog.list(); とやってみましょう。ダイアログを構成するコンポーネントの階層構造がコンソールに出力されます。けっこう深い入れ子構造になっているのが分かると思います。(すごく見にくいけど(^^; サンプルプログラムのcomponents.lengthは、それぞれの階層における子コンポーネントの数を意味します。 ただ、JOptionPaneがどのようなコンポーネントによって構成されているかを意識することには、あまり意味がありません。 JOptionPaneはダイアログを勝手に作ってくれるだけであって、そのコンポーネント構成についてはAPIに定められていないからです。Javaのバージョンが異なれば、ぜんぜん違う構成をしているかも知れないのです。

yojiskt
質問者

お礼

ありがとうございます。 何となく理解できました。 (^^