【问题标题】:Java Swing: How to remove an anonymous ActionListener from a componentJava Swing:如何从组件中删除匿名 ActionListener
【发布时间】:2010-10-28 23:43:25
【问题描述】:

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

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

【问题讨论】:

  • (请注意,这可能不是设计您想要做的任何事情的有效方法。最好让监听器在那里触发,然后进行一些检查/多态性以禁用操作(可能会切换状态而不是禁用)。)

标签: java swing


【解决方案1】:

您可以通过:getActionListeners 方法获取它们:

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

我不确定它是否会抛出 ConcurrentModificationException

【讨论】:

  • 可能不会...我敢打赌它将侦听器在内部存储为 ArrayList,然后将它们复制到 ActionListener 数组中以返回它们。很想知道它是否会...
  • 没有人会返回一个内部数组,不是吗? (无论如何都不会调整大小。)
  • for( ActionListener al : button.getActionListeners() ) 这不会编译,但这是个好主意
  • for (JButton b: button) for( ActionListener al : b.getActionListeners() ) b.removeActionListener(al);那行得通
【解决方案2】:

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

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

    • 在这个方法中你可以迭代 通过所有动作监听器和 删除它们。我觉得更好 设计如果你在这里比在 客户端类。
  2. 如果您不想这样做,那么我认为 Tom Hawtin 建议在您的 ButtonListener 中使用状态是个好主意。

  3. 如果做不到这一点,您始终可以选择采用一种非常“hacky”的方式,即在您的客户端类中存储动作侦听器的集合。

    • Map&lt;JButton, ButtonListener&gt;(如果每个按钮总是只有一个监听器),或者
    • Map&lt;JButton, List&lt;ButtonListener&gt;&gt;(如果每个按钮可以有多个侦听器)是我可能使用的。

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-08-30
      • 2017-07-11
      • 2021-02-06
      • 2010-10-10
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多