![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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);
}
}
No.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();
(以下省略)
}
}
というコードを混同してミックスしているということです。
No.5
- 回答日時:
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の部分を復習した方がいいと思いますよ。
Cfg4sA3W4sさん、回答ありがとうございます。
私が色々と調べたところでは、「JFrameの内部コンテナJrootPaneというクラスのコンテナがあり、
更にその中にcontentPaneというオブジェクトのコンテナがある。
Swingでは、JFrameへは必ずcontentPaneを介してコンポーネントを貼り付けなければならない。」と
あります。
これから考えれば、JFrameのオブジェクトにcontentPaneをaddしてやらなければならない、また、他の
オブジェクトにcontentPaneをaddするのは間違いになるのではないでしょうか。
Canvasのオブジェクトにaddしても良い場合もあるのでしょうか。
その場合でも文法的には間違いではないのでしょうか。
それとも、CanvasはAWTなので、また、別の考え方(文法)があると言うことでしょうか。
No.4
- 回答日時:
Container gc = getContentPane();の部分をContainer gc = jf.getContentPane();に変更すれば、このエラーは出なくなります。
Cfg4sA3W4sさん、回答ありがとうございます。
>Container gc = getContentPane();の部分をContainer gc = jf.getContentPane
();に変更すれば、このエラーは出なくなります。
この意味は、「Frameのオブジェクト(jf)にContentPaneというオブジェクトをよんでやる」
という意味だと思うのですが、別の方の回答は「Container gc = c.getContentPane();」
との回答です。
この意味は、「CanvasにContentPane()をのせる(よんでやる)」という意味だと思うのですが、
これはどちらでもよいということでしょうか。
他の参考書などでは、「ContentPane()は、Frameのオブジェクトの一部」みたいな書き方を
見たのですが、Frameのオブジェクトとかその一部とかがよく理解出来ないのですが。
宜しくお願い致します。
No.3
- 回答日時:
「インスタンス」の意味が理解できていないようです。
通常のクラスを考えます。
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参照ではないので、この
ようなエラーは発生しません。
No.2
- 回答日時:
static とは最初(実行前のディスク上にファイルとして
存在する時点)から実体があり、プログラムがメモリに
ロードされた時点で、即座に実行可能です。
これに対し、インスタンスに依存する(非static)ものは
インスタンス化して初めてメモリ上に展開されるので、それ
以前には参照したり、実行したりできません。
Canvas1をインスタンス化した後、そのインスタンスの
メソッドを呼ぶべきです。
Canvas1 c = new Canvas1;
Container gc = c.getContentPane(); //←このように
gc.add(jp);
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);
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java java final 1 2022/06/10 22:49
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java eclipse実行ができない 2 2022/07/27 04:47
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数名の付け方
-
private static という変数の修飾
-
インスタンス参照でアクセスで...
-
static 参照するには??
-
文字列を日付に変換でParseExce...
-
Delphiでインスタンスが作成さ...
-
VC#での24ビットbmp形式での保...
-
オブジェクト参照がオブジェク...
-
VB6.0で、DLLを動的に参照したい
-
Javaのソースコードの解説お願...
-
複数の変数を宣言する時、同時...
-
マルチスレッド間でデータ交換...
-
C# クラスのインスタンスについて
-
static修飾子の使いどころ
-
「インスタンス」の意味をわか...
-
SQLを連続発行する時の正しい(?...
-
インターフェースとトレイトっ...
-
エクセルVBAで、条件に一致する...
-
【JAVA】与えられた金額を貨幣...
-
「天声人語」をインターネット...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
複数の変数を宣言する時、同時...
-
VB.NET getとsetの概念がわかり...
-
生成したインスタンスを削除す...
-
C# インスタンスの破棄
-
C#において、同じインスタンス...
-
「インスタンス」の意味をわか...
-
変数の参照でエラーが出てしま...
-
SQLを連続発行する時の正しい(?...
-
オブジェクト参照がオブジェク...
-
文字列を日付に変換でParseExce...
-
VB6.0で、DLLを動的に参照したい
-
javaのクラスの作り方、エラー...
-
インスタンスを同じ名前で作成...
-
エクセル(複数インスタンス)...
-
フォームの存在をチェックする方法
-
C#「オブジェクト参照が必要で...
-
newしないインスタンス?実体化...
おすすめ情報