public class SelCodeDialog extends JDialog
APanel P_A= new APanel ();
BorderLayout borderLayout1 = new BorderLayout();
BorderLayout borderLayout2 = new BorderLayout();
JPanel jPanel1 = new JPanel();
public SelCodeDialog(Frame frame, String title, boolean modal) {
super(frame, title, modal);
try {
jbInit();
pack();
}
catch(Exception ex) {
ex.printStackTrace();
}
}
public SelCodeDialog() {
this(null, ", true);
}
private void jbInit() throws Exception {
this.setSize(new Dimension(1024, 768));
this.getContentPane().setLayout(borderLayout2);
this.setResizable(false);
jPanel1.setLayout(null);
this.getContentPane().add(jPanel1, BorderLayout.CENTER);
//パネル貼り付け
P_A.setBounds(new Rectangle(0, 0, 1024, 768));//微調整
jPanel1.add(P_A, null);
jPanel1.setVisible(true);
this.validate();
}
}
環境はJBuilderです。
上記のようにダイアログにパネルを貼り付けようとしたのですが
java.lang.Error: Do not use XXX.XXXDialog.add() use XXX.XXXDialog.getContentPane
().add() instead
というエラーが出てきます。
何を意味しているのですか?
ダイアログにパネルを貼り付けることは出来ますよね。
このコードの具体的にはどこでそうなるのかわかりませんけれど、
> java.lang.Error: Do not use XXX.XXXDialog.add() use
XXX.XXXDialog.getContentPane().add() instead
これは、そのメッセージのままです。
詳しい解説が必要であれば、
http://java.sun.com/j2se/1.3/ja/docs/ja/api/javax/swing/JDialog.html
あたりから JRootPane 等の解説をあわせて読めばわかるかと。
余談ですけど、
この『ペンギンは飛べるが、飛ぶとエラーになる』系のつくりは
APIの設計としてはあまりよくありませんよね。
getContentPane().add()を呼べばいいってわかってるんだったらはじめかそうしてくれればい
いのに、とか。
PAIさん有難うございました。
解決いたしました。
余談の話がいまいち理解できないのですが(笑)。
お時間あればもう少し詳しく教えてください。
JDKに文句つけてもしょうがないので、あくまで余談なのですが・・・
JDialog のソースを見るとわかるのですが、
自分に add すべきか、 getContentPane に add すべきかを
isRootPaneCheckingEnabled によって判別して、
わざわざ例外を投げているんです。
『RootPane はレイアウトを持っていないのだから、そこに add するのはおかしい』
という考えもあるかもしれませんけれど、
『add というメソッドが公開されているからにはできる限り add できるべきだ』
という考えもあるはずですよね。
特に、ここでは『getContentPane の結果に add すれば良い』ということがわかっているのだ
から、
エラーメッセージを吐いて終わりにするのではなくて、
JDialog の方のデフォルトの実装で getContentPane の結果に add してくれても良かったは
ずですよね。
現に remove はそうなってるっぽいし。
ペンギンは鳥類ですけど飛べません。
ですが、鳥類インターフェイスに 飛ぶ メソッドを作ってしまったからには
ペンギンの実装も、ペンギンに飛び方があるのであれば飛ぶべきだと、
そう思うわけです。
って私が思ったところで何も変わりはしませんけどね。