从 JButton 中删除一个 ActionListener

Posted

技术标签:

【中文标题】从 JButton 中删除一个 ActionListener【英文标题】:Remove an ActionListener from JButton 【发布时间】:2021-02-08 01:24:27 【问题描述】:

我想从JButton 中删除动作监听器。但我有一个像这样的ActionListener

btn.addActionListener(new ActionListener() 
     public void actionPerformed(ActionEvent e) 
          btn.removeActionListener();
     
);

但是btn.removeActionListener(); 需要括号内的参数,所以我有点难过。

【问题讨论】:

btn.removeActionListener(this); 以便在动作侦听器中将其删除。 那行不通 “我想从JButton 中删除动作监听器” .. 为什么?根据该问题的答案(是的,我希望看到答案),为按钮创建一个Action 可能会更好。可以禁用Action,这样做会向用户表明该按钮不可用。 假设按钮在主菜单上,但每次我调用该主菜单时,它都会添加另一个动作监听器。虽然我刚刚解决了谢谢。 【参考方案1】:

获取 ActionListener。

如果您阅读AbstractButton API,JButton 有一个public ActionListener[] getActionListeners(),它为您提供了一个侦听器数组。获取它们(可能只有一个),然后从按钮中删除它(如果有多个,则使用 for 循环删除它)。

例如

ActionListener[] listeners = btn.getActionListeners();
for (ActionListener listener : listeners) 
    btn.removeActionListener(listener);

话虽如此,我想知道这是否可能是XY Problem,其中更好的解决方案是采用不同的方法。也许您只需要在侦听器中放置一个布尔语句,并根据类中标志(布尔字段)的状态来改变其行为(它调用的代码)。

【讨论】:

我有点困惑。对不起,我是编码新手。这是 for 循环只是另一种制作动作监听器的方法吗?我的意思是,当我单击按钮时,fooloop 中有什么激活?因为它不起作用。 @L0raxeoC: ???不,它与创建另一个 ActionListener 无关。您的评论让我感到困惑,因为 for 循环完全按照您的要求执行 - 删除给定按钮的所有动作侦听器。

以上是关于从 JButton 中删除一个 ActionListener的主要内容,如果未能解决你的问题,请参考以下文章

ActionListener添加到JButton但不起作用

从 JList 中删除一行

单击JButton时如何删除JTable中的当前行?

如何从 JButton 中检索数据?

让 JButton 打开一个新的 JPanel

如何在单击JButton后刷新JTable