Java swing - 多个控件的相同处理程序

时间:2012-08-10 14:06:11

标签: java swing event-handling

我想知道是否有任何其他方法可以处理和来自N个控件中的任何一个,这将读取ActionCommand值并根据该值进行操作。到目前为止,我基本上都有ActionListener的默认值,我将其添加到每个控件中。例如,如果我有50个复选框,我想写一个类似

的方法
void process(){ 
    getCommandValueAndDoSth();
}

但不是为所有复选框实例化ActionListener,我只想控制所有复选框。

3 个答案:

答案 0 :(得分:2)

您可以为所有组件拥有一个侦听器。

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 :(得分:1)

您可以将相同的ActionListener附加到多个组件(例如,添加到所有复选框)。处理程序只需要能够从ActionEvent派生所有必需的信息(如果需要,它可以使用event.getSource()获取组件。)

答案 2 :(得分:0)

在我的情况下,我只是想知道窗口中的任何控件是否已更改,应该允许用户“应用”这些更改。实际上,您可以使用lambda轻松添加它们。以下是JCheckBoxJComboBox<>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的代码。