• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:JFrameのエラーの意味が分かりません)

JFrameのエラーの意味が分かりません

このQ&Aのポイント
  • JFrameのエラーについて、非staticメソッドへのstatic参照ができないことを意味します
  • コメントアウトした場合には、windowに色が付かない原因があるようです
  • 要約文3

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

  • ベストアンサー
  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.5

> スミマセン、質問ばかりになりましたが、宜しくお願いします。 いえいえ、少しでもお役に立てれば幸いです。 > これをJAVAのルールとして決めた特別な背景はあるのでしょうか。 特別な背景というよりもstaticメソッド(クラスメソッド)の特性だと思って下さい。例えば、 public class Sample { public static void test() { ..... } } のようにstaticメソッドtest()を持つSampleクラスがあったとします。 このtest()メソッドの呼び出し方は分かりますよね? Sample.test()で呼び出すことができますよね。つまり、Sampleクラスのインスタンスを生成しなくても呼び出すことができるのです。これは考え方を変えてみると、 Sample sample1 = new Sample(); Sample sample2 = new Sample(); Sample.test(); のように、Sampleクラスのインスタンスがいくつ生成されていても、staticメソッドであるtest()メソッドは常に同じ動作が保証されなければなりません(もちろん、引数によって動作が変わることはありますが)。 もしも、test()メソッド内でインスタンスメソッドを呼び出してしまうと、「Sampleクラスのオブジェクトの状態」によってtest()メソッドの動作が変わってくる可能性があります。 staticメソッド内ではstaticメソッドしか呼び出せないのはそういった理由からだと思います。 また同様の理由から、staticメソッド内ではstatic変数しか参照できません。 > 具体的にクラスメソッドを使う場合とはどのような場合でしょう これは難しい質問ですね…。というよりも考え方は人それぞれだと思いますので。 簡単に言えば、オブジェクトの状態(インスタンス変数の値など)によって動作が変わることのないメソッドはクラスメソッドにすることができます。 例えば引数だけ与えれば結果が返ってくる、JavaのMathクラスの各メソッドが良い例だと思います。 > 「インナークラス」と「匿名(無名)クラス(本により「匿名インナークラス」と書いているものもありますが)」とは具体的にどのように違って使い分けるのでしょうか。 「使い分け」で判断するならば、インナークラスは「命名されたクラス」ですのでそのインナークラスにアクセスできれば任意の場所で、 MyWindowListener listener = new MyWindowListener(); のようにインスタンスを生成できるということでしょうか。 一方、匿名クラスは下記のように記述するのですが addWindowListener(new WindowAdapter() { public windowClosed(WindowEvent e) { System.exit(0); } }); 上記の例で言えばaddWindowListener()メソッド内でインスタンス化していますが、それ以外の場所では使用することはできません。

eiji_0035
質問者

お礼

 x_jouet_xさん、レス有り難う御座います。   >Sample sample1 = new Sample(); Sample sample2 = new Sample(); Sample.test(); のように、Sampleクラスのインスタンスがいくつ生成されていても、staticメソッドであるtest()メソッドは常に同じ動作が保証されなければなりません #成るほど分かり易い説明で納得しました。 > クラスメソッドを使う場合とはどのような場合でしょう 例えば引数だけ与えれば結果が返ってくる、JavaのMathクラスの各メソッドが良い例だと思います。 #思い当たります。 >インナークラスは「命名されたクラス」で任意の場所で、インスタンスを生成できるということでしょうか。  匿名クラスは、メソッド内でインスタンス化していますが、それ以外の場所では使用することはできません。 有り難う御座います、私なりに一応理解で来ました、今後とも宜しくお願いします。  ところで専門家と有りますが、仕事でプログラムを日常的に組んでるのですか。  うらやましい限りですが、、、

その他の回答 (4)

  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.4

> "setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);"は"JFrame"を 継承したクラスが"JFrame"の持っているインスタンスメソッドを呼び出した使っている はい、その考え方で良いです。 > staticメソッドからはインスタンスメソッドにはアクセスできない はい、staticメソッド内でインスタンスメソッドを呼び出すことはできません。 staticメソッド内で呼び出せるのはstaticメソッドのみです。 > ところで他の方法でWindowを閉じる方法はあるのでしょうか。 まず1つは、java.awt.event.WindowListenerインタフェースを実装したリスナークラスを用意しておいて、JFrameクラスのaddWindowListener()メソッドでリスナーを追加する方法があります。 ただ、WindowListenerインタフェースはWindowが閉じるとき以外のメソッドも全て実装しないといけないので、Windowを閉じるときの処理を行うだけであればabstractクラスである、java.awt.event.WindowAdapterクラスを継承したクラスを用意する方が一般的です。 かなり省略した例ですが、下記がそのソースコードです。 ---------- public class MyFrame extends JFrame { public MyFrame() { addWindowListener(new MyWindowListener()); } class MyWindowListener extends WindowAdapter { public windowClosed(WindowEvent e) { System.exit(0); } } } ---------- 上記は「インナークラス」でMyWindowListenerクラスを書いていますが、他にも「匿名(無名)クラス」で書く方法もあります。 ※) 難しい話かも知れませんので特に触れませんが…。 もう1つは、JFrameクラスを継承したクラスであればprocessWindowEvent()メソッドをオーバーライドする方法もあります。 その場合は下記のようなソースコードになります。 ---------- public class MyFrame extends JFrame { protected void processWindowEvent(WindowEvent e) { if (e.getID() == WindowEvent.WINDOW_CLOSED) { System.exit(0); } } } ----------

eiji_0035
質問者

お礼

 x_jouet_xさん、こんばんは、何度も親切なレスを有り難うございます。  再度質問させて頂きます。    色々と調べてみましたが、 > staticメソッドからはインスタンスメソッドにはアクセスできない  これをJAVAのルールとして決めた特別な背景はあるのでしょうか。  一般論として(初心者ですが)初心者にとって分かりにくいルール、例外が有りすぎて何故。。。。。と思ってしまうのですが。  オブジェクト指向自体の理屈は理解出来たとしてもそれを実際にプログラムに書いてやるのはメッチャ分かりにくいです。  特にこのルールを決めた何か特別の背景があるのでしょうか。  もっと使い易いルールにしたら良いのと本を読みながら何時も考えてしまいます。  また、具体的にクラスメソッドを使う場合とはどのような場合でしょう、逆にインスタンスを生成しなくても、 クラス変数、メソッドとして定義して使う方が楽と思う場合も多いのですが。。。。。    また、説明しにくい質問になるかも知れませんが、 >「インナークラス」と「匿名(無名)クラス(本により「匿名インナークラス」と書いているものもありますが)」 とは具体的にどのように違って使い分けるのでしょうか。  スミマセン、質問ばかりになりましたが、宜しくお願いします。

  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.3

> "setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);"について再度質問致します。 はい。 ”MyFrame”クラスのインスタンスメソッドとして呼び出していますね。 ちなみに、 「自分のクラスのインスタンスメソッドである」ことを明示的に書きたい場合は、"this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);"のように書けばいいです。

eiji_0035
質問者

お礼

 x_jouet_xさん、ありがとうございます。  ところで基本的な質問ですが、"setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);"は"JFrame"を 継承したクラスが"JFrame"の持っているインスタンスメソッドを呼び出した使っている、という考えで良いの でしょうか。  また、staticメソッドからはインスタンスメソッドにはアクセスできない、ということでしょうか。  ところで他の方法でWindowを閉じる方法はあるのでしょうか。  JFrame以外(Swing以外)ならListener(インタ-フェィス)をつけて、イベントから"exit();"を呼び出すという処理 が他にあるだけでしょうか。  宜しくお願いします。

  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.2

回答の前に一点だけ。 class Frame_Ren extends JFrame としているので、Frame_RenクラスはJFrameクラスを継承していますよね。 そのため、Frame_RenクラスはJFrameクラスが持っているメソッド(正確にはpublicメソッドとprotectedメソッドですが)を継承しているので、setDefaultCloseOperation()メソッドはFrame_Renクラスのメソッドとして使用できるということを覚えておいて下さい。 > このエラーの意味はどのように対処してやれば良いのでしょうか。 Frame_Renクラスのpublic static void main()メソッドの中で、setDefaultCloseOperation()メソッドを呼び出していますよね。 setDefaultCloseOperation()メソッドは「インスタンスメソッド」と呼ばれるもので、staticメソッド内でインスタンスメソッドを呼び出すことはできません。 一番簡単な対処方法は、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); としているところを fr2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); に修正してやればいいです。 > 何故かwindowに色が付きません、この原因は何でしょうか。 JFrameのウィンドウ上に何らかの処理を行いたい場合は、実際にはContentPane(コンテントペイン)と呼ばれるContainer(コンテナ)に対して行う必要があります。 なので背景色を変更したい場合は、 fr2.setBackground(Color.red); ではなく、 fr2.getContentPane().setBackground(Color.red); として下さい。 コンテントペインの詳細については参照URLをご覧下さい。

参考URL:
http://allabout.co.jp/internet/java/closeup/CU20071031A/index4.htm
eiji_0035
質問者

お礼

 x_jouet_xさん、レス有り難うございます。  "setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);"について再度質問致します。  下のような場合には、"MyFrame()"というコンストラクタの中で書いているので、内容的には  "this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);" という考え、または”MyFrame”クラスのインス タンスメソッドとして呼び出していると考えるということでしょうか。 ========================================================= class Mypanel extends JPanel implements ActionListener { public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.red); g.drawOval(10,40,50,50); } public void actionPerformed(ActionEvent e) { System.out.println(e.getActionCommand()); } } class MyFrame extends JFrame implements ActionListener { MyFrame() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300,300); Mypanel panel = new Mypanel(); add(panel); panel.setBackground(Color.yellow); setVisible(true); JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); JMenu fileMenu = new JMenu("file"); menuBar.add(fileMenu); fileMenu.setMnemonic('o'); } public void actionPerformed(ActionEvent e) { System.out.println(e.getActionCommand()); } } public class Mypanel_090901 { public static void main(String[] args) { MyFrame myframe = new MyFrame(); } }

  • isle
  • ベストアンサー率51% (77/150)
回答No.1

 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  ↓  fr2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); staticではないので、インスタンスを対象にメソッドを呼び出さなくてはなりません。  fr2.setBackground(Color.red);  ↓  fr2.getContentPane().setBackground(Color.RED); JFrameはContentPaneが覆い被さった構造になっているので、これで期待する動作になります。

関連するQ&A