如何在不触发动作侦听器的情况下从 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
,因为 ItemEvent
与 ActionEvent
并不完全相同。
另一种方法是在清除 JComboBox
之前简单地调用方法 removeActionListener,然后在清除 addActionListener
之后调用方法 addActionListener
。
当我尝试清除我的 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
,因为 ItemEvent
与 ActionEvent
并不完全相同。
另一种方法是在清除 JComboBox
之前简单地调用方法 removeActionListener,然后在清除 addActionListener
之后调用方法 addActionListener
。