JFrameの非staticメソッドgetContentPane()をstatic参照することはできません

このQ&Aのポイント
  • Java初心者の質問です。プログラム中の「Container gc = getContentPane();」の箇所で、「型 JFrame の非 static メソッド getContentPane() を static 参照することはできません」というエラーが出ます。解決方法を教えてください。
  • Java初心者が困っています。エラーメッセージ「型 JFrame の非 static メソッド getContentPane() を static 参照することはできません」と表示されています。どのように変更すればよいでしょうか。
  • JFrameの非 static メソッド getContentPane() を static 参照することはできないというエラーメッセージが表示されています。どのように修正すればよいのでしょうか。Java初心者です。
回答を見る
  • ベストアンサー

 static 参照するには??

 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); } }

  • htgo
  • お礼率33% (407/1224)
  • Java
  • 回答数6
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
回答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(); (以下省略) } } というコードを混同してミックスしているということです。

htgo
質問者

お礼

Cfg4sA3W4sさん、有難う御座いました。 今後とも宜しくお願いします。

その他の回答 (5)

回答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の部分を復習した方がいいと思いますよ。

htgo
質問者

お礼

 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();に変更すれば、このエラーは出なくなります。

htgo
質問者

お礼

 Cfg4sA3W4sさん、回答ありがとうございます。  >Container gc = getContentPane();の部分をContainer gc = jf.getContentPane ();に変更すれば、このエラーは出なくなります。  この意味は、「Frameのオブジェクト(jf)にContentPaneというオブジェクトをよんでやる」 という意味だと思うのですが、別の方の回答は「Container gc = c.getContentPane();」 との回答です。  この意味は、「CanvasにContentPane()をのせる(よんでやる)」という意味だと思うのですが、 これはどちらでもよいということでしょうか。  他の参考書などでは、「ContentPane()は、Frameのオブジェクトの一部」みたいな書き方を 見たのですが、Frameのオブジェクトとかその一部とかがよく理解出来ないのですが。  宜しくお願い致します。

  • nda23
  • ベストアンサー率54% (777/1415)
回答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参照ではないので、この ようなエラーは発生しません。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

static とは最初(実行前のディスク上にファイルとして 存在する時点)から実体があり、プログラムがメモリに ロードされた時点で、即座に実行可能です。 これに対し、インスタンスに依存する(非static)ものは インスタンス化して初めてメモリ上に展開されるので、それ 以前には参照したり、実行したりできません。 Canvas1をインスタンス化した後、そのインスタンスの メソッドを呼ぶべきです。 Canvas1 c = new Canvas1; Container gc = c.getContentPane(); //←このように gc.add(jp);

htgo
質問者

お礼

 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); } }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

関連するQ&A

  • JFrameのエラーの原因が分かりません。

     java初心者です、宜しくお願いします。  JFrameのコードを下記のように書いてやりましたが、「サーバーにデプロイするものが見つかり ません。」というエラーが出ます。   色々と参考書を見ながら勉強していますが、エラーの原因がさっぱりわかりません。    どなたか宜しくお願いします。 ============================================================================ public class JF4 extends JFrame { public void init() { Container cnt = getContentPane(); setBackground(Color.RED); setSize(400,400); setTitle("title"); setVisible(true); } } ================================================================================= public class JF4 extends JFrame { public void init() { Container cnt = getContentPane(); JPanel panel = new JPanel(); panel.setBackground(Color.RED); getContentPane().add(panel); setSize(400,400); setTitle("title"); setVisible(true); } }

  • SwingでgetContentPaneのエラーです、お願いします

     今晩は、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); } }

    • ベストアンサー
    • Java
  • swingのJframeについて

    JFrameについて質問があるのですが import javax.swing.*; public class JFrameTest extends JFrame{ public static void main(String[] args){ JFrameTest frame = new JFrameTest(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } JFrameTest(){ JPanel p = new JPanel();   Container contentPane = getContentPane(); ContentPane.add(p);   pack(); } } このプログラムと import javax.swing.*; public class JFrameTest{ public static void main(String[] args){ JFrame frame = new JFrame("フレームのタイトル"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds( 10, 10, 300, 200); frame.setVisible(true); JPanel p = new JPanel();   Container contentPane = frame.getContentPane(); frame.ContentPane.add(p);   frame.pack(); } } このプログラムは何が違うのでしょう? やってることはまったく一緒だと思ってたのですが、全然違うみたいです。 上のプログラムの JFrameTest(){ はコンストラクタと呼ばれるものなのでしょうか? しょぼい質問で申し訳ないのですが誰か教えていただけないでしょうか。

    • ベストアンサー
    • Java
  • 「staticでない…」について

    今,下記のプログラムを実行させたいのですが,次のエラーが出て困っています。基本的なことだと思いますが,つまずいて修復できません。 どのような対処をすればよいでしょうか。 エラー:「staticでない変数thisをstaticコンテキストから参照することができません。」 プログラム import java.awt.*; import java.awt.geom.*; import javax.swing.*; import java.util.*; public class Test{ public static int R,G,B; public static void main (String[] args){ R = Integer.parseInt(args[0]); G = Integer.parseInt(args[1]); B = Integer.parseInt(args[2]); MyFrame frame = new MyFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } class MyFrame extends JFrame{ public static final int WIDTH = 400; public static final int HEIGHT = 400; public MyFrame(){ setTitle("Test"); setSize(WIDTH,HEIGHT); Container contentPane = getContentPane(); MyPanel panel = new MyPanel(); contentPane.add(panel);}} class MyPanel extends JPanel{ public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; Rectangle2D rect = new Rectangle2D.Double(100,100,100,50); g2.setColor(new Color(R,G,B)); g2.fill(rect);}}}

    • ベストアンサー
    • Java
  • ボタンが表示されません

    //テキストパッドをつくっています。 //このプログラムはボタンが表示されませんなぜ? import java.awt.*; import javax.swing.*; class Test_Text extends JFrame{ public static void main(String args[]){ Sample_text st = new Sample_text(); JFrame jf = new JFrame("Test_Text"); JTextArea jt = new JTextArea(50,30); Container c = jf.getContentPane(); c.add(jt,BorderLayout.PAGE_START); jf.pack(); jf.setVisible(true); jf.setDefaultCloseOperation(EXIT_ON_CLOSE); } public void Sample_text(){ JButton j1,j2; j1 = new JButton("編集"); j2 = new JButton("保存"); setLayout(new FlowLayout()); this.add(j1); this.add(j2); } }

  •  型Containerのメソッドadd(String ,Compone

     型Containerのメソッドadd(String ,Component)は引数(JPanel ,String)に適用できません。  今晩は、java初心者です、エラーの意味が理解出来ません、宜しくお願い致します。  《A》というプログラムと《B》というプログラムで、クラスを「class MyPanel extends JPanel」と「class JPanel」に変えただけで、「型Containerのメソッドadd(String ,Component)は引数(JPanel ,String)に適用できません。」というエラーがでます。  一体何が原因でしょうか。  JPanelを継承したクラス(MyPanel)を呼び出すのか、そのまま、JPanelクラスを呼び出すのかの違いだけで、内容的には何も変わるところがないはずだと思うのですが。  意味が理解出来ません。 ======================================================================== 《A》 public class Sample extends JFrame { Sample() { this.setSize(300,200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MyPanel panel = new MyPanel(); this.add(panel , BorderLayout.CENTER); this.setVisible(true); } public static void main(String[] args) { new Sample(); } } class MyPanel extends JPanel { public void paintComponent(Graphics g) { g.setColor(Color.red); g.fillOval(50,50,100,100); } } ============================================================ 《B》 public class Sample extends JFrame { Sample() { this.setSize(300,200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); this.add(panel , BorderLayout.CENTER); this.setVisible(true); } public static void main(String[] args) { new Sample(); } } class JPanel { public void paintComponent(Graphics g) { g.setColor(Color.red); g.fillOval(50,50,100,100); } } =======================================================================

    • ベストアンサー
    • Java
  • JPanelの切り替えと再描画

    ContainerにJPanelをaddし、ボタンを押すことで現在addされているJPanelとは違うJPanelを生成し、再描画させようとしているのですが、うまくいかないため、質問致しました。 -- src --- public class Test extends JFrame implements ActionListener {   Container container;   JPanel panel;   JButton btn;      public Test() {     container = getContentPane();     container.setLayout(new BorderLayout());     // ボタン用パネル     JPanel btnp = new JPanel();     btnp.setLayout(new FlowLayout());     container.add(btnp, BorderLayout.NORTH);          btn = new JButton("aaa");     btn.addActionListener(this);     btnp.add(btn);          // 対象のパネル     panel = new JPanel();       (略)panelの設定     container.add(panel, BorderLayout.CENTER);     setVisible(true);     setBounds(50, 50, 300, 300);     setDefaultCloseOperation(EXIT_ON_CLOSE);   }      public void actionPerformed(ActionEvent e) {     if (e.getSource() == btn) {       container.remove(1);       panel = new JPanel();  // 本来はJPanelを継承したクラスをnewしています       container .add(panel);       repaint();       // ※     }   }      public static void main(String args[]) {     Test t = new Test();   } } ※の箇所をcontainer.repaint() にしたり、paintImmediaely() にしたり出来そうな事を色々試したつもりではいるのですが、うまくいきません… ボタン押下後に、ウィンドウの枠をクリックすると描画されるのですが、いまいちよくわかりません… なにか分かる方いらっしゃいましたらご教授願います。

  • シンボルを見つけられません

    javaについて勉強しているのですが、円の中に四角を作るというプログラムを作ろうとしたところ tes.java:43:シンボルを見つけられません。 シンボル:メソッド drawSquare(int,int,int,java.awt.Graphics) 場所:Assortのクラス a.drawSquare(x,y,w,g); ^ というエラーが出てコンパイルできません。drawCircleからdrawSquareを実行するようにしたいのですが、どうしたらよいか教えていただけないでしょうか。 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class tes { static MyCanvas mc; public static void main(String[] args) { tes ac_listener = new tes(); JFrame jf = new JFrame("tes"); JPanel p = new JPanel(); mc = new MyCanvas(); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mc.setPreferredSize(new Dimension(700,700)); jf.getContentPane().add(mc); p.add(mc); jf.getContentPane().add(p); jf.pack(); jf.setVisible(true); } } abstract class Assort{ double x,y; } class Square extends Assort{ public void drawSquare(int x, int y, int w, Graphics g) { double k=Math.sqrt(2); double _w=w/2/k; g.drawRect(x-(int)_w/2, y-(int)_w/2, (int)_w, (int)_w); } } abstract class Circle extends Assort{ } class Circle1 extends Circle { Assort a; Circle1(Assort _a) { a = _a; } void drawCircle(int x, int y, int w, Graphics g){ g.drawOval(x-w/4,y-w/4,w/2,w/2); a.drawSquare(x,y,w,g); } } class MyCanvas extends JPanel { public void paintComponent( Graphics g ) { super.paintComponent(g); Circle1 d1 = new Circle1 ( new Square() ); d1.drawCircle(350,350,700,g); } }

    • ベストアンサー
    • Java
  • Eclipseから実行すると画像が読み込まれない

    下記のコードをEclipseから実行すると画像が読み込まれないのですが、コマンドプロンプトから実行すると画像が読み込まれます。 コードが同じなのに不思議です…。 原因はどんなことが考えられるのでしょうか? class test extends JFrame{ public static void main(String args[]){ test frame = new test("タイトル"); frame.setVisible(true); } test(String title){ setTitle(title); setBounds(100, 100, 500, 500); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); ImageIcon icon1 = new ImageIcon("img.jpg"); JLabel label1 = new JLabel(icon1); p.add(label1); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); } }

    • ベストアンサー
    • Java
  • フレームを消したい

    こんにちは。 いつもお世話になっております。 また、どうしてもわからないことが出てきてしまいました。 質問よろしいでしょうか? 以下のプログラムを実行して 「次へ」と書かれたボタンをクリックし 次に現れるフレーム上の「このフレームだけ消す」 と書かれたボタンをクリックしたときに 「f2」(2つ目のフレーム)だけ閉じるようにしたいのです。 以下の場合は両方とも閉じてしまうのです。 何かよい方法ご存知ありませんか? よろしくお願いいたします。 ================================================== import java.awt.*; import javax.swing.*; import java.awt.event.*; class unload { public static void main(String[] args) { JFrame f=new JFrame("kiki"); Origin p=new Origin(); Container ct=f.getContentPane(); ct.add(p); f.pack(); f.setVisible(true); } } class Origin extends JPanel implements ActionListener { JButton b; Origin() { b=new JButton("次へ"); this.add(b); b.addActionListener(this); } public void actionPerformed(ActionEvent e) { if (e.getSource()==b) { JFrame f2=new JFrame(); Origin2 p2=new Origin2(); Container ct=f2.getContentPane(); ct.add(p2); f2.pack(); f2.setVisible(true); } } } class Origin2 extends JPanel implements ActionListener { JButton b2; Origin2() { b2=new JButton("このフレームだけ消す"); this.add(b2); b2.addActionListener(this); } public void actionPerformed(ActionEvent e) { if(e.getSource()==b2) { System.exit(0); } } }

    • ベストアンサー
    • Java

専門家に質問してみよう