性格いい人が優勝

 static 参照するには??

 Java初心者です、宜しくお願いします。
 下のようなプログラムを書きましたが、「Container gc = getContentPane();」
の箇所で、「型 JFrame の非 static メソッド getContentPane() を static
参照することはできません」とエラーが出ます。
意味がわかりません、またどのように変更してやればよいのでしょうか。
宜しくお願いします。 

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

class Canvas1 extends JFrame
{
public void paint(Graphics g)
{
g.drawRect(150, 150, 50, 50);
}
}


public class SimpleDraw extends JFrame
{
public static void main(String[] args)
{
JFrame jf = new JFrame();

JPanel jp = new JPanel();

Container gc = getContentPane();

gc.add(jp);

Canvas1 c = new Canvas1;

jp.add(c);
jf.add(jp);
jf.setVisible(true);
}
}

A 回答 (6件)

 ContentPaneはJFrameの表示領域のことなので、JFrameにaddできせん。


当然、他のオブジェクトにもaddできません。

それから、あなたのソースコードをよく見て気が付いたことは、
JFrameを継承した場合の書き方である

public class SimpleDraw extends JFrame {
public static void main(String args[]) {
SimpleDraw jf = new SimpleDraw();
(以下省略)
}

public SimpleDraw() {
// SimpleDrawのContentPaneをgetする
// Container gc = this.getContentPane();のthisを省略している
ContentPane gc = getContentPane();
(以下省略)
}
}

というコードと、JFrameを継承しない場合の書き方である

public class SimpleDraw {
public static void main(String args[]) {
JFrame jf = new JFrame();

// jfのContentPaneをgetする
Container gc = jf.getContentPane();
(以下省略)
}
}

というコードを混同してミックスしているということです。
    • good
    • 0
この回答へのお礼

Cfg4sA3W4sさん、有難う御座いました。

今後とも宜しくお願いします。

お礼日時:2010/09/19 10:47

getContentPane()はJFrameクラス(またはJFrameを継承したクラス)のオブジェクトに関連付けられたメソッド(staticメソッドではないという意味)です。

(メソッドは関数と同じ意味です。オブジェクトは、JFrame、Stringなどのクラス型の変数といったものです。)

あなたのソースコードには、JFrameクラス(またはJFrameを継承したクラス)のオブジェクトが3つあります。SimpleDrawクラスのオブジェクト(あなたのソースでは使っていない)、SimpleDrawクラス内でインスタンス化(「JFrame jf = new JFrame();」の部分)しているJFrameクラスのオブジェクトのjf、SimpleDrawクラス内でインスタンス化(「Canvas1 c = new Canvas1;」の部分)しているCanvas1クラスのcです。

「Container gc = jf.getContentPane();」とした場合は、jfのgetContentPane()を呼び出すということになり、「Container gc = c.getContentPane();」とした場合は、cのgetContentPane()を呼び出すということになります。

あなたのソースコードでは、Canvas1クラスのcをJPanelクラスのオブジェクトjpにaddしているので、わたしの見る限りでは、「Container gc = jf.getContentPane();」の方が正しいと思われます。

ただ、このソースコードはかなり不自然な書き方をしているため、わたしの見方が正しいとは断言できません。Javaの基本書でJFrameの部分を復習した方がいいと思いますよ。
    • good
    • 0
この回答へのお礼

 Cfg4sA3W4sさん、回答ありがとうございます。

 私が色々と調べたところでは、「JFrameの内部コンテナJrootPaneというクラスのコンテナがあり、
更にその中にcontentPaneというオブジェクトのコンテナがある。
 Swingでは、JFrameへは必ずcontentPaneを介してコンポーネントを貼り付けなければならない。」と
あります。
 これから考えれば、JFrameのオブジェクトにcontentPaneをaddしてやらなければならない、また、他の
オブジェクトにcontentPaneをaddするのは間違いになるのではないでしょうか。

 Canvasのオブジェクトにaddしても良い場合もあるのでしょうか。
 その場合でも文法的には間違いではないのでしょうか。 
 それとも、CanvasはAWTなので、また、別の考え方(文法)があると言うことでしょうか。

お礼日時:2010/08/30 22:25

Container gc = getContentPane();の部分をContainer gc = jf.getContentPane();に変更すれば、このエラーは出なくなります。

    • good
    • 0
この回答へのお礼

 Cfg4sA3W4sさん、回答ありがとうございます。

 >Container gc = getContentPane();の部分をContainer gc = jf.getContentPane
();に変更すれば、このエラーは出なくなります。

 この意味は、「Frameのオブジェクト(jf)にContentPaneというオブジェクトをよんでやる」
という意味だと思うのですが、別の方の回答は「Container gc = c.getContentPane();」
との回答です。

 この意味は、「CanvasにContentPane()をのせる(よんでやる)」という意味だと思うのですが、
これはどちらでもよいということでしょうか。

 他の参考書などでは、「ContentPane()は、Frameのオブジェクトの一部」みたいな書き方を
見たのですが、Frameのオブジェクトとかその一部とかがよく理解出来ないのですが。

 宜しくお願い致します。

お礼日時:2010/08/28 16:10

「インスタンス」の意味が理解できていないようです。


通常のクラスを考えます。
public class Futu {
    public int x;
}
これはint型変数を1個持つクラスの「雛型」を定義
しています。しかし、定義だけで実体はありません。
この状態で、Futu.xはメモリのどこにも存在しない
ので、見たり触ったりできません。

Futu a = new Futu();
Futu b = new Futu();
a.x = 2;
b.x = 8;
System.out.println(a.x); //2が表示される
System.out.println(b.x); //8が表示される

上記のようにすると、実体aとb(メモリ領域は別々)が
生成されるので、a.x とか b.x のように操作できる
ようになります。当然ですが、a.x と b.x は別物
なので、異なる値を設定できます。

これに対し、staticは最初から唯一のインスタンスが
存在します。
public class Kotei {
    public static int z;
}
最初から実体があるので、いきなり Kotei.z = 0;の
ように操作できます。

Kotei a = new Kotei();
Kotei b = new Kotei();
a.z = 2;
b.z = 5;
Kotei.x = 9;
System.out.println(a.z); //9が表示される

実体は1個なので、複数個あるどのインスタンスを
操作してもターゲットは同じもの指すからです。
メソッド内に定義した変数は自動変数と呼ばれます。
これはスタック上に形成され、メソッドの入口で生成され、
出口で末梢されます。仮にマルチスレッドで同時に複数の
スレッドから実行されても異なるメモリに作られるので、
干渉することはありません。
メソッド外に定義した変数はstaticかインスタンス依存に
なります。ご質問の例では"static"が無いので、インス
タンス依存です。実体が無いまま操作することはできません。
尚、誤解の無いように申しますが、「mainだからできない」
という訳ではありません。「static参照」とは今まで述べた
ように、インスタンス化しないで参照することを指します。

非staticメソッドは自身が所属するクラスがインスタンス化
されないと実行できません。つまり、実行される時には自身の
インスタンスが存在するのです。従って、インスタンス変数を
操作する時は暗黙のうちに自身のインスタンスに属する変数を
扱うことになります。故に、static参照ではないので、この
ようなエラーは発生しません。
    • good
    • 0

static とは最初(実行前のディスク上にファイルとして


存在する時点)から実体があり、プログラムがメモリに
ロードされた時点で、即座に実行可能です。
これに対し、インスタンスに依存する(非static)ものは
インスタンス化して初めてメモリ上に展開されるので、それ
以前には参照したり、実行したりできません。
Canvas1をインスタンス化した後、そのインスタンスの
メソッドを呼ぶべきです。

Canvas1 c = new Canvas1;
Container gc = c.getContentPane(); //←このように
gc.add(jp);
    • good
    • 0
この回答へのお礼

 nda23さん、回答有難うございます。

 下の例では、mainメソッドの中にint i = 10 ;を書くとエラーにはなりません。
 しかし、mainメソッドの外にint i = 10 ;と書くと、「非staticフィールドiを
static参照できません」と同様のエラーになります。
 このエラーの原因についても、やはり「mainメソッドからは、インスタンス化され
た・・・・にしかアクセス出来ない」というルールと、同じ原因なのでしょうか?
 このへんのところがよく理解出来ていないのですが、再度ご教示宜しくお願い致します。


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

public class Sample {

/*static*/ int i = 10 ;

public static void main(String[] args){

//int i = 10 ;

System.out.print("i = " + i);
}


}

お礼日時:2010/08/23 23:54

「static じゃない」んだから, 何らかのオブジェクトに対して呼んでください.

    • good
    • 0

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