dポイントプレゼントキャンペーン実施中!

Javaのダイアログの背景色の変え方を教えてください。
今、課題を作成中なのですが、ダイアログパネルを出すとパネルの背景色が「ライトグレー」になります。その色が他のパネルの色と合わないので、変更したいと思い、setBackgroudなどで設定変更したのですが、色の変化がありません。SUNのAPIを見ると変更できそうなのですが、できませんでした。
変更の仕方をご存知でしたら、教えてください。

ソース1
private void Dialog_process(String msg) {
JOptionPane pane = new JOptionPane();
JOptionPane.showMessageDialog(this,msg,"",JOptionPane.WARNING);
pane.setForegroung(Color.red);
pane.setBackground(Color.white);
}

ソース1の結果は
ダイアログのパネル背景色は「ライトグレー」、文字色は「黒」です。

ソース2
private void Dialog_process(String msg) {
JOptionPane pane = new JOptionPane(msg,JOptionPane.WARNING_MESSAGE);
JDialog pane_dialog = pane.createDialog(this,"");
pane.setForegroung(Color.red);
pane.setBackground(Color.white);
pane_dialog.show();
}

ソース2の結果は
ダイアログのパネル背景色の外は「白」、中は「ライトグレー」、文字色は「黒」です。

望む結果はパネル背景色が「白」、文字色は「赤」です。
制限事項はありません。もともと「JOptionPaneではパネル背景色が変えられないのでは」の疑問もあります。
お願いします。(^^

A 回答 (2件)

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);
}
    • good
    • 0
この回答へのお礼

ありがとうございました。(^^
正しく動作しました。これで、中途半端でなく、希望する形に出来上がりました。
大変申し訳ないのですが、ソースの解説をお願いします。
粗方はわかるのですが、もう一歩入って、教えて頂きたいのです。
手が空いたときでも結構ですので、よろしくお願いします。

(_ _)<<

質問)

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の値が変化するのは何故ですか

お礼日時:2002/07/31 09:25

再び失礼します。



mainの方で
dialog.list();
とやってみましょう。ダイアログを構成するコンポーネントの階層構造がコンソールに出力されます。けっこう深い入れ子構造になっているのが分かると思います。(すごく見にくいけど(^^;
サンプルプログラムのcomponents.lengthは、それぞれの階層における子コンポーネントの数を意味します。

ただ、JOptionPaneがどのようなコンポーネントによって構成されているかを意識することには、あまり意味がありません。
JOptionPaneはダイアログを勝手に作ってくれるだけであって、そのコンポーネント構成についてはAPIに定められていないからです。Javaのバージョンが異なれば、ぜんぜん違う構成をしているかも知れないのです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/07/31 21:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!