2

ActionCommand値を読み取り、それに基づいて動作するN コントロールのいずれかからイベントを処理し、イベントを処理する他の方法があるかどうか疑問に思っていました。これまでのところ、基本的に、ActionListener各コントロールに個別に追加する定義があります。たとえば、チェックボックスが 50 個ある場合、次のようなメソッドを書きたいと思います。

void process(){ 
    getCommandValueAndDoSth();
}

しかし、すべてのチェックボックスに対して ActionListener をインスタンス化するのではなく、すべてのチェックボックスを制御したいと思います。

4

3 に答える 3

3

すべてのコンポーネントに対して 1 つのリスナーを使用できます。

ActionListener al = new ActionListener {
  @Override
  public void actionPerformed(ActionEvent e) {
    // either do it like this
    process(e.getActionCommand());
    // or like this to distinguish between the controls
    if (e.getSource() == firstElement) processChangeInFirstElement();
    else if (e.getSource() == secondElement) processChangeInSecondElement();
    // etc
  }
}

Component firstElement = new JCheckBox("asdf");
firstElement.addActionListener(al);

Component secondElement = new JTextField();
secondElement.addActionListener(al);

複数のタイプのリスナーが必要な場合 ( ChangeListener, MouseListener, ActionListener, KeyListener, ...)、それらのリスナー タイプごとに 1 つのインスタンスを用意し、それらを対応するコンポーネントに適用します。

于 2012-08-10T14:59:54.077 に答える
1

同じ ActionListener を複数のコンポーネント (すべてのチェックボックスなど) にアタッチできます。ハンドラーは必要なすべての情報を ActionEvent から取得できれば十分です (必要な場合は、event.getSource() を使用してコンポーネントにアクセスできます)。

于 2012-08-10T14:53:20.953 に答える
0

私の場合、ウィンドウ内のコントロールが変更されたかどうかを知りたかっただけで、ユーザーがそれらの変更を「適用」できるようにする必要があります。実際には、ラムダを使用して非常に簡単に追加できます。以下は、、、JCheckBoxおよびJComboBox<>の例ですJXDatePickerJTextField/はどちらもJTextAreaもう少し複雑で、ドキュメント リスナーが必要です。

chckbx.addItemListener(e -> process()); //Check box itemListeners don't trigger when hovering
comboBox.addActionListener(e -> process()); //Triggered when selection changes
datePicker.addActionListener(e -> process()); //When date changes
addChangeListener(txtField, e -> process()); //Text field needs a documentListener

テキスト フィールドのドキュメント リスナーaddChangeListenerのコード。

于 2020-01-28T10:30:06.097 に答える