• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:addとremoveActionListener)

addとremoveActionListener

このQ&Aのポイント
  • addActionListenerとremoveActionListenerの使い方
  • プログラムの簡易版で他のクラスからaddActionListenerを追加する方法
  • removeActionListenerの使用方法について

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

  • ベストアンサー
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.2

こんにちは。 ほかのクラスからaddしたい理由はわかりませんが、やるとしたら現状のソースの変数のスコープとか考えないといけません。 まず、現状のソースで出来ない理由。 menuitem1がローカル変数であるため外部から参照できない。 仮にmenuitem1をフィールド変数にしても現状の呼び出しだとnullの為、NullPointerExceptionが発生する。 SetにJFrameを渡す必要があるとしたらJFrameではなくTest1ではないか? (これだけのソースを見る限りでは渡す必要性がわからない) 以上を踏まえて直してみると public class Test1 extends JFrame { // フィールド変数にすることにより参照が可能 private JMenuItem menuitem1; public Test1() { super("test1"); setBounds(100,100,806,659); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); JMenuBar menubar = new JMenuBar(); JMenu menu1=new JMenu("メニュー"); menubar.add(menu1); menuitem1=new JMenuItem("終了"); menu1.add(menuitem1); setJMenuBar(menubar); // menuitem1=new JMenuItem("終了")以降に呼ぶ Set set=new Set(this); add(set); } public static void main ( String[] args ) { new Test1().setVisible ( true ); } class Set extends JPanel{ Set(final Test1frame){ // menuitem1=new JMenuItem("終了")以降に呼ばないとmenuitem1がnullの為エラーになる。 menuitem1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ System.out.println ( "押された"); // removeActionListenerは設定されたリスナーを削除するので以下のような感じで使う // menuitem1に設定されているリスナーをすべて取得(配列)して最初のリスナーを削除する // すなわち、一度メニューが選択されると次からはリスナーが削除されているため「押された」が表示されなくなる menuitem1.removeActionListener(menuitem1.getActionListeners()[0]); } }); } } }

Gorgons
質問者

お礼

わかりやすかったです 返信ありがとうございます

すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#177743
noname#177743
回答No.1

いろいろ突っ込むところはあるのですが、もっとも根本的な部分で。 プログラムの流れをよく見てください。 まず、Setインスタンスを作っていますね。そしてそれをJFrameにaddしています。 続いて、JMenuBarを作り、組み立てています。 /*ここにaddを入れたかった という部分は、Setのコンストラクタ、つまりSetインスタンスを作るときに呼び出される部分です。 ということは、/*ここにaddを入れたかった の部分が呼び出されるとき、まだメニューは存在しないわけですね。存在しないメニューにどうやってイベントを組み込むのでしょう? なぜ、そういう妙なことになってるのかといえば、「そのオブジェクトに関することはそのオブジェクトの中で完結させる」というオブジェクト指向の基本ができていないからです。 その上のTest1のコンストラクタ内でJMenuItemインスタンスは組み込まれていますね。なぜ、JFrameで組み込んだJMenuItemのイベントリスナーを、全く関係のないJPanelのコンストラクタで設定するのでしょう? どういう理由でやっているのか、何をやろうとしているのかがわからないと、なんとも回答のしようがないのですが……。

Gorgons
質問者

お礼

返信ありがとうございます。 正直、作成している時はJMenuBarがSetの前に作成されていないことに気づかなかったです・・・ JMenuItemをSetでやっているのは、このプログラムは簡略化したもので、実際は色々処理がある中でこの処理を入れようとしているから、といった感じでしょうか

すると、全ての回答が全文表示されます。

関連するQ&A