Java Swing:如何从组件中删除匿名 ActionListener

IT小君   2021-12-09T03:42:17

JButtons用匿名创建了一个数组,ActionListeners在某些条件下我想删除所有的ActionListeners,但该.removeActionListeners方法需要一个ActionListener作为参数。我将如何删除动作侦听器?

for (int i=0; i < button.length; i++){
    button[i] = new JButton();
    button[i].addActionListener(listener.new ButtonListener());
}
点击广告,支持我们为你提供更好的服务
评论(3)
IT小君

您可以使用以下方法获取它们:getActionListeners方法:

for( JButton currentButton: button ) {
    for( ActionListener al : currentButton.getActionListeners() ) {
        currentButton.removeActionListener( al );
    }
}

我不确定它是否会抛出一个ConcurrentModificationException

2021-12-09T03:42:17   回复
IT小君

我理解您的问题,并且正如其他人所建议的那样,遍历来自客户端类的所有操作侦听器可能会解决您的直接问题。

  1. 在这种情况下,您真正​​想做的是扩展 JButton 的功能,这是解决此问题的一种方法 - 扩展 JButton 并添加一个调用的方法removeAllActionListeners()(不带任何参数)。

    • 在此方法中,您可以遍历所有动作侦听器并删除它们。我认为如果你在这里这样做比在客户端类中进行更好的设计。
  2. 如果您不想这样做,那么我认为 Tom Hawtin 在您的 ButtonListener 中使用状态的建议是一个好主意。

  3. 如果失败,您总是可以选择退回到一种非常“hacky”的方式,即在您的客户端类中存储一组动作侦听器。

    • Map<JButton, ButtonListener> (如果每个按钮总是只有一个听众),或
    • Map<JButton, List<ButtonListener>> (如果每个按钮可以有多个侦听器)是我可能使用的。

我认为方法12更可取,方法3表明设计不佳(但更容易一起破解)。

请注意,如果您确实使用了方法1或类似的方法,请检查您正在访问的方法或属性是否是线程安全的(如 OscarRyz 所述),如果不是,请使用synchronized以确保线程安全。

2021-12-09T03:42:17   回复
IT小君

你不能。没有人引用这些对象。为了能够删除它们,您需要将其作为数据成员/变量存储在代码中,然后将该变量传递给removeActionListener()方法。但是,您可以做的是使用该getActionListeners()方法获取ActionListenerButton. 然后,您需要确定要删除哪一个,但如果只有一个,那应该很容易;-)

2021-12-09T03:42:17   回复