2009-02-26 8 views
0

私は、任意の数の項目を持つJMenuを持つJavaプログラムを持っています(この場合、現在、別のプログラムにロードされている各動的ライブラリのメニュー項目が1つあります)。 JCheckBoxMenuItemをメニューに追加するためのループを実行しています。何個あるかわからないからです。どのようにActionListenerと呼ばれるメニュー項目を決定できますか?

どのオプションを呼び出すかを認識しているこれらのメニュー項目のアクションリスナーを設定するにはどうすればよいですか?具体的には、私は同じ機能を実行したいが、それぞれのメニュー項目(およびチェックがトグルされているのかデトグリングされているのかに応じて異なる機能)の異なるセットまたはパラメータで実行したい。

誰かが正しい方向に向けるでしょうか?

答えて

2

event.getSource()は、イベントが発生した特定のボタンを確実に通知しますが、生成されたボタンの追跡やボタンのスヌーピングが必要な副作用があります。また、ライブラリを識別するために使用されているものとは異なる名前(バージョン情報を含む可能性があります)をユーザに提示することもできます。ボタンの "ActionCommand"プロパティを使用すると、それらの問題を分離する方法が提供される場合があります。したがって、チェックボックスメニュー項目の生成とリスナーでコードを変更する必要があります。

ActionListener actionListener = ... // whatever object holds the method, possibly this 
String[] libraries = ... // however you get your library names 
JMenu parentMenu = ... // the menu you are adding them to 

for (String s : libraries) { 
    // prettyName is a method to make a pretty name, perhaps trimming off 
    // the leading path 
    JCheckBoxMenuItem child = new JCheckBoxMenuItem(prettyName(s), true); 
    child.setActionCommand(s); 
    parentMenu.acc(child); 
} 

アクションハンドラのコードは次のようになり...それを行うには

public void actionPerformed(ActionEvent evt) { 
    // the 'current' selection state, i.e. what it is going to be after the event 
    boolean selected = ((JCheckBoxMenuItem)evt.getSource()).isSelected(); 
    String library = evt.getActionCommand(); 
    ... process based on library and state here... 
} 
2

は間違いなくこの上でお読みください。 actionPerformedメソッドで、event.getSource()を使用します。必要に応じて、すべてのメニュー項目に同じActionListenerを追加できます。

1

Actionオブジェクトは、特定のアクションに必要なオプションが設定されたJCheckBoxMenuItemに渡すことができます(チェックボックスを参照して状態を確認することもできます)。これにより、アクションが実際に実行されたときに、何らかの処理を行う必要がなくなります。これは、正しいアクションが呼び出されるためです。

0

きれいな方法は、それぞれに異なるActionListenerを作成することです。 EventObject.getSourceは醜いです。

+0

確かに、コンパイル時に未知のパラメータで各ActionListenerを呼び出す方法はありますか? – Zxaos

関連する問題