• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:GUI入門書のサンプルコード)

意味がわからないGUI入門書の中古本のサンプルコードの解説をお願いします

このQ&Aのポイント
  • JavaのGUI入門書を中古で購入しましたが、サンプルコードが意味がわからずコンパイルエラーが発生しています。どなたか解説していただけますか。
  • 私はWin VistaとJDK7を使用しています。以下がソースコードとコンパイルエラーです。
  • このコードでは、MyButtonクラス内にあるmainメソッドでボタンを作成し、ボタンのアクションリスナーとしてMyActionListenerクラスのインスタンスを追加しています。しかし、buttonがstaticではないためにコンパイルエラーが発生しています。

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

  • ベストアンサー
noname#161640
noname#161640
回答No.1

見てて、頭がくらくらしてくるサンプルコードですね。そのソースをすべて活かした形で修正するのは無理です。まぁ、極力、作者の意図をくんだつもりで修正すると、こんな感じでしょうか。 package jp.sample; // 適当に import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class MyButton { static JButton button = new JButton("MyButton"); public static void main(String[] args) { JFrame frame = new JFrame("MyFrame"); Container pane = frame.getContentPane(); button.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ if(e.getSource() == button) System.out.println("button was pressed"); } }); pane.add(button); frame.setBounds(100, 50, 300, 200); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } かなり気持ち悪いですが……。 まぁ、本が古いということなので、JDKのバージョンがあがったために引っかかる部分もありますが、それ以前の話として、そのサンプルを考えた人は、クラスとインスタンスの根本的なところがわかっていないように思えます。正直いえば、その本で勉強するのはやめたほうが無難です。この作者は、自分の書いたソースコードが実際に動くかどうかまったく検証していませんね。 いくつか補足を。 ※1 何故ここで宣言しているのか おそらく、その後でMyActionListenerインスタンス内のactionPerformed内でe.getSource() == buttonというようにインスタンスを参照するのでフィールドとして保管しておけばいい……というように考えたのでは、と想像できます。が、この作者は、自分自身(MyButtonクラス自身)をインスタンス化していない、ということに考えが至らなかったようです。したがって、このインスタンスフィールドはまったく意味をなしていません。 ※1 何故ここにもあるのか 結局、これがそのまま使われてしまう、ということになるでしょう。インスタンスフィールドに宣言したのを忘れて、ここでも宣言している、としか思えません。 ※2 MyActionListenerクラスはstaticでないので使用できない staticでない、というか、そもそもこのMyButton自体はインスタンス化されていないのですよ……。インスタンス化されていないクラス内の内部クラスを使うという時点で設計に無理があります。 全体としてもっとも無理がないのは、MyButtonをextends JFrameし、このmyButtonクラスのインスタンスを生成して使う、という感じでしょう。以下のような感じでしょうか。 import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class MyButton extends JFrame { JButton button = null; public static void main(String[] args) { MyButton frame = new MyButton("MyFrame"); } public MyButton(String s){ super(s); Container pane = this.getContentPane(); button = new JButton("MyButton"); button.addActionListener(new MyActionListener()); pane.add(button); this.setBounds(100, 50, 300, 200); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } class MyActionListener implements ActionListener { @Override public void actionPerformed(ActionEvent e){ if(e.getSource() == button) System.out.println("button was pressed"); } } }

jaxocd
質問者

お礼

ありがとうございます。 スコープの観点から書いたbuttonも、内部クラスもインスタンス化しないとアクセスできないんですね。すっきりしました。 この本は約10年前の物で、サンプルは前例のコピペに追記して…といった感じなので誤植が多いです。 買い替えも検討します。

関連するQ&A