【问题标题】:Remove an ActionListener from JButton从 JButton 中删除一个 ActionListener
【发布时间】: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,这样做会向用户表明该按钮不可用。
  • 假设按钮在主菜单上,但每次我调用该主菜单时,它都会添加另一个动作监听器。虽然我刚刚解决了谢谢。

标签: java swing awt jbutton actionlistener


【解决方案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 循环完全按照您的要求执行 - 删除给定按钮的所有动作侦听器。
猜你喜欢
  • 2012-11-27
  • 1970-01-01
  • 2017-06-30
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 2012-12-26
  • 1970-01-01
相关资源
最近更新 更多