如何在不触发动作侦听器的情况下从 jComboBox 中删除所有项目?

How do I remove all items from a jComboBox without triggering an action listener?

当我尝试清除我的 JComboBox 中列出的项目时,它会触发我的 ActionListener 绑定到组合框。我有另一个函数,结果被递归调用并生成重复值。有没有办法暂时禁用动作侦听器并从 JComboBox 中删除所有内容而不触发事件?

jComboBox_database.removeAllItems();

jComboBox_database.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
jComboBox_database.addActionListener(new java.awt.event.ActionListener() {
    @Override
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        jComboBox_databaseActionPerformed(evt);

您可以在 removeAllItems() 之前和之后更改 JComboBox 的 ActionCommand。

String oldCommand = jComboBox_database.getActionCommand();
jComboBox_database.setActionCommand("cmdIgnore");
jComboBox_database.removeAllItems();
jComboBox_database.setActionCommand(oldCommand);

并在您的 ActionListener 中:

public void actionPerformed(java.awt.event.ActionEvent evt) {
    if( ! "cmdIgnore".equals(evt.getActionCommand())) {
        jComboBox_databaseActionPerformed(evt);
    }
}

据我所知,您无法“禁用”ActionListener

只要 JComboBox selection 发生变化,就会通知 ActionListener。清除项目还会将“selected 项目”设置为空,从而调用您的 actionPerformed 方法。

假设您只想在实际 select 一个值时调用递归方法,也许您应该改为实现 ItemListener

jComboBox_database.addItemListener(new java.awt.event.ItemListener() {
    public void itemStateChanged(java.awt.event.ItemEvent evt) {
        if (evt.getStateChange() == ItemEvent.SELECTED) {
            jComboBox_databaseActionPerformed(evt);
        }
    }
});

当然,您可能还需要更改方法的参数 jComboBox_databaseActionPerformed,因为 ItemEventActionEvent 并不完全相同。

另一种方法是在清除 JComboBox 之前简单地调用方法 removeActionListener,然后在清除 addActionListener 之后调用方法 addActionListener