我想知道是否有任何其他方式来处理来自任何 N 个控件的事件,它会读取该ActionCommand
值并根据该值采取行动。到目前为止,我基本上有一个定义ActionListener
,我分别添加到每个控件中。例如,如果我有 50 个复选框,我想编写一个类似的方法
void process(){
getCommandValueAndDoSth();
}
但我不想为所有复选框实例化 ActionListener,我只想控制所有复选框。
我想知道是否有任何其他方式来处理来自任何 N 个控件的事件,它会读取该ActionCommand
值并根据该值采取行动。到目前为止,我基本上有一个定义ActionListener
,我分别添加到每个控件中。例如,如果我有 50 个复选框,我想编写一个类似的方法
void process(){
getCommandValueAndDoSth();
}
但我不想为所有复选框实例化 ActionListener,我只想控制所有复选框。
您可以为所有组件设置一个侦听器。
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, ...
),那么您拥有每种侦听器类型的一个实例,并将它们应用于相应的组件。
您可以将相同的 ActionListener 附加到多个组件(例如,附加到所有复选框)。处理程序只需要能够从 ActionEvent 派生所有需要的信息(如果需要,它可以使用 event.getSource() 获取组件)。
就我而言,我只是想知道窗口中的任何控件是否已更改,并且应该允许用户“应用”这些更改。实际上,您可以使用 lambda 轻松添加它们。以下是JCheckBox
、JComboBox<>
和的示例JXDatePicker
。两者JTextField
/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的代码。