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

 今晩は、java勉強中のものです、宜しくお願いします。

 下のようなプログラムを組んでみましたが、「型JFrameから非staticメソッドgetContentPane()にstatic参照
することは出来ません」というエラーコードです。
 原因が良く分かりません、どなたか教えて下さい。
 いくら考えても原因がよく分かりません、宜しくお願いします。

================================================================
public class Panel_train extends JFrame{

public static void main(String[] args) {

Container cnt = getContentPane();
JPanel jpanel = new JPanel();
JTextArea jtext = new JTextArea("Hello World", 100, 50);
jpanel.add(jtext);
cnt.add(jpanel, BorderLayout.CENTER);

JFrame frame = new JFrame("テスト");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 100);
frame.setVisible(true);
}
}

A 回答 (3件)

回答させて頂く前に1つ。



http://www.javadrive.jp/start/
などのJava初心者のためのサイトや書籍で、もう1度Javaの基礎(特にクラスの部分)を習得した方がいいかも知れませんね。
私自身、Javaを書くようになって10年近く経ちますが、これぐらい長期間Javaのプログラムを触っていると「当たり前」の考え方というか概念を噛み砕いて説明することが難しいです。
私の説明不足も否めないですが・・・すみません。

さて、
> コンストラクタはデフォルトで作成される場合もあると本には書いています。

これはですね。
自分でクラスを作成するときにコンストラクタを1つも書かないとコンパイラがコンパイル時にこのデフォルトコンストラクタを自動的に作成してくれるのです。
先の回答で「自作のクラスには必ずコンストラクタが必要になります。」と書いたのは、コンストラクタを1つも書かなくてもコンパイラによってデフォルトコンストラクタが作成されるので「クラスには必ずコンストラクタが存在する」という意味で書きました。

htgoさんが書かれたソースコードですが、自分でコンストラクタを書いていなければコンパイラによってデフォルトコンストラクタが作成されます。
これはmain()メソッドがある、ないに関わらず全てのクラスで共通しています。


> mainメソッドは実行時に一番に呼び出されるメソッドであれば一番に生成され、以後他の実行文が呼び出されていくのではないでしょうか。

はい、その考えで合っています。
今回のソースコードは、
・JFrameクラスを継承している
・main()メソッドを持っている
・main()メソッド内で自分自身のインスタンスを生成している
ということが混乱を招いているような気がします。

1度、下記のようなmain()メソッドを持ったMainクラスを作成して、Mainクラスからプログラムを実行させるようにしてみて下さい。

----------
public class Main() {
public static void main(String[] args) {
Panel_train frame = new Panel_train("テスト");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 100);
frame.setVisible(true);
}
}
----------

このようにMainクラスとPanel_trainクラスの2つに分けた場合、Panel_trainクラスはどのように書かないといけないか考えてみて下さい。
# Panel_trainクラスのmain()メソッドは削除して下さいね。
    • good
    • 0
この回答へのお礼

 x_jouet_xさん、回答有り難うございます。
 確かにクラス、コンストラクタの考え方の理解が不足しています。
なかなか詳しく説明している本とか
サイトが見あたらなく、理解に苦労していますが、もう少し勉強してみます。
 今後とも宜しくお願いします。

お礼日時:2009/08/24 09:30

> "Panel_train"をインスタンス化してやったのに、何故このようなエラーが出るのでしょうか。



先の回答で私が書いたソースコードとhtgoさんが書かれているソースコードをよーく見比べてみて下さい。

Container cnt = getContentPane();

の処理を行っている場所が違いますよ。
htgoさんはpublic static void main()メソッドの中で、私はPanel_trainクラスのコンストラクタの中で書いていますよ。

「コンストラクトPanel_trainは未定義です」というエラーは、htgoさんがPanel_trainクラスの中で

public Panel_train(String title) {
...
}

というString型の変数を引数に持つコンストラクタをまだ定義していないからです。Panel_trainクラスのような自作のクラスには必ずコンストラクタが必要になります。ただし例外として、そのクラスが下記のような引数を持たず何も処理しないコンストラクタしかない場合は何も記述する必要はありません。

/*-- 引数なし・何も処理しないコンストラクタ --*/
public Panel_train() {
}


なお私が書いたソースコードでは、

Panel_train frame = new Panel_train("テスト");

のようにタイトルの文字(テストのことです)を引数としてPanel_trainクラスのインスタンスを生成しているので、public Panel_train(String title)というコンストラクタを定義しています。



> "title"とはどのような意味でしょうか。

引数名自体は特に意味はありません。
単にコンストラクタpublic Panel_train(String title)の引数としているので、

public Panel_train(String title) {
System.out.println(title);
}

のようにコンストラクタ内でその引数名で変数を使用することができます。

ちなみにJFrameクラス(それ以外のクラスもですが…)のjavadocをご覧になったことはありますか?
今回、Panel_trainクラスはJFrameクラスを継承したものなので、JFrameのjavadoc(特にコンストラクタ)をご覧になればコンストラクタpublic Panel_train(String title)で引数名をtitleとした理由が分かると思いますよ。

・JFrameのjavadoc
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/ja …
    • good
    • 0
この回答へのお礼

x_jouet_xさん、回答有難うございます。
>String型の変数を引数に持つコンストラクタをまだ定義していないからです。Panel_trainク
>ラスのような自作のクラスには必ずコンストラクタが必要になります。
>ただし例外として、そのクラ>スが下記のような引数を持たず何も処理しないコンストラクタ
>しかない場合は何も記述する必要はあ>りません。
>/*-- 引数なし・何も処理しないコンストラクタ --*/
>public Panel_train() { }

疑問点が2点ほどあります、宜しくお願いします。
コンストラクタはデフォルトで作成される場合もあると本には書いています。
今回の私のコードは、いきなりMainメッソドから始まっており、デフォルトコンストラクタが作成されるケースには
該当しないのでしょうか。
特段”super()”も呼び出してはいません。
(勿論コンストラクタが無ければ書くことも出来ないのですが)
>自作のクラスには必ずコンストラクタが必要になります。
#この意味が良く理解できません。

また、”Container cnt = getContentPane()”は、mainメソッドの中で書いています、この違いがわかりません。
私の考えは、mainメソッドは実行時に一番に呼び出されるメソッドであれば一番に生成され、以後他の実行文
が呼び出されていくのではないでしょうか。

以上宜しくお願いします。

お礼日時:2009/08/15 13:42

簡潔に言うと、staticメソッド(この場合は、public static void main())の中でJFrameクラスのインスタンス(非static)メソッドであるgetContentPane()を使用しているために出るエラーなのですが…。



ソースコードを拝見すると、JFrameを継承したクラス(Panel_train)でJTextAreaを表示したいようですね。
このような場合は一番手っ取り早い方法は、下記のようにPanel_trainクラスのコンストラクタの中にやりたい処理を書いてしまうことです。

----------
public class Panel_train extends JFrame {

public Panel_train(String title) throws HeadlessException {
super(title);

Container cnt = getContentPane();
JPanel jpanel = new JPanel();
JTextArea jtext = new JTextArea("Hello World", 100, 50);
jpanel.add(jtext);
cnt.add(jpanel, BorderLayout.CENTER);
}

public static void main(String[] args) {
Panel_train frame = new Panel_train("テスト");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 100);
frame.setVisible(true);
}
}
----------

ただ、この方法だとやりたい処理が多くなってきた場合、コンストラクタの中がどんどん長くなってしまうので、Panel_trainクラスのprivateメソッドでやりたい処理を書いてコンストラクタの中でそのメソッドを呼び出すような作りにするとよりスマートなソースになります。

また、public static void main()メソッドは上記のようにJFrame(またはJFrameを継承したもの)を表示する処理だけ書きます。
ちなみに質問で挙げられていたソースだと、public static void main()メソッド内で新たにJFrameクラスのインスタンスを生成していますので、このままだと「テスト」というタイトルが付いた空のJFrameが表示されるだけですよ。
折角Panel_trainクラスを作ったんですから、Panel_trainクラスのインスタンスを生成しましょうね。

こういったソースを書くためには他人が作ったソースコードを見てみるのも勉強になりますよ。
頑張って勉強して下さい。
    • good
    • 0
この回答へのお礼

 x_jouet_xさん、有り難う御座います。
 ところで、"JFrame frame = new JFrame("テスト")"を"Panel_train frame = new Panel_train("テスト")"に
変更してやりましたが、やはり「型JFrameから非staticメソッドgetContentPane()にstatic参照
することは出来ません」と、"Panel_train frame = new Panel_train("テスト")"の箇所で「コンスト
ラクトPanel_trainは未定義です」というエラーコードです。
"Panel_train"をインスタンス化
してやったのに、何故このようなエラーが出るのでしょうか。

 また、"public Panel_train(String title)"の"title"とはどのような意味でしょうか。

======================================

public class Panel_train extends JFrame{

public static void main(String[] args) {

Container cnt = getContentPane();
JPanel jpanel = new JPanel();
JTextArea jtext = new JTextArea("Hello World", 100, 50);
jpanel.add(jtext);
cnt.add(jpanel, BorderLayout.CENTER);

Panel_train frame = new Panel_train("テスト");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 100);
frame.setVisible(true);
}
}

お礼日時:2009/08/15 01:23

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