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

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

 for (int i=0; i < button.length; i++){ button[i] = new JButton(); button[i].addActionListener(listener.new ButtonListener()); } 

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

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

我不确定它是否会抛出ConcurrentModificationException

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

  1. 在这种情况下H / W,你真正想要做的是扩展JButton的function,这是解决这个问题的一种方法 – 扩展JButton并添加一个名为removeAllActionListeners()的方法(它不带任何参数) 。

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

  3. 如果不这样做,你总是可以选择退回一个非常“hacky”的方式,即在你的客户端类中存储一组动作监听器。

    • Map (如果每个按钮总是只有一个监听器),或者
    • Map> (如果每个按钮可以有多个侦听器)就是我可以使用的。

我认为方法12是优选的,方法3表示设计差(但更容易一起破解)。

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

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