0

任意の数の項目を持つJMenuがあるJavaプログラムがあります(この場合、現在別のプログラムにロードされているダイナミックライブラリごとに1つのメニュー項目があります)。JCheckBoxMenuItemをメニューに追加するループを実行しています。これは、いくつあるかわからないためです。

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

誰かが私を正しい方向に向けることができますか?

4

5 に答える 5

2

間違いなくこれを読んでください:http://java.sun.com/docs/books/tutorial/uiswing/misc/action.html

つまり、ActionListener を menuItems に追加します。actionPerformed メソッドでは、event.getSource() を使用します。必要に応じて、すべてのメニュー項目に同じ ActionListener を追加できます。

于 2009-02-26T00:56:25.550 に答える
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...
}
于 2009-02-26T03:11:52.730 に答える
1

event.getSource() がそれを行う必要があります。

于 2009-02-26T00:54:18.940 に答える
1

Actionメニューを作成するときに、特定のアクションに必要なオプションを使用してオブジェクトを構成済みに渡すことができますJCheckBoxMenuItem(チェック ボックスへの参照をプッシュして状態を確認することもできます)。この方法では、正しいアクションが呼び出されるため、アクションが実際に実行されるときに何らかの処理を行う必要はありません。

于 2009-02-26T00:57:30.167 に答える
0

それを行うためのクリーンな方法は、ActionListenerそれぞれに異なるものを作成することです。EventObject.getSource醜いです。

于 2009-02-26T12:29:03.653 に答える