的Java Swing:如何从一个组件

问题描述:

删除一个匿名的ActionListener我创建的JButtons阵列匿名ActionListeners并在一定条件下我想删除所有的ActionListeners,但.removeActionListeners方法需要ActionListener作为参数。我将如何去除动作侦听器?的Java Swing:如何从一个组件

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

(只是注意,这可能不是设计无论你正在尝试做的有效途径,更好的让听众有射击,并有经过一些检查/多态性禁用动作(可能开关状态,而不是禁用)。) – 2010-10-28 23:55:52

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

你可以让他们:getActionListeners方法:

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

我不是当然,如果它会抛出ConcurrentModificationException

+0

也许不是......我敢打赌,它内部存储的听众作为一个ArrayList,然后把它们拷贝到的ActionListeners数组来回报他们。好奇,想看看它是否会尽管... – 2010-10-28 23:52:09

+0

没有人会返回一个内部数组,他们会吗? (它不会调整大小。) – 2010-10-28 23:53:19

+0

for(ActionListener al:button.getActionListeners())这将不会编译,但它是一个不错的主意 – 2010-10-28 23:56:40

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

  1. H/W在这种情况下,你真正要做的是延长一个JButton的功能,那就是解决这个问题的一种方法 - 延长JButton,并添加一个名为removeAllActionListeners()方法(不不带任何参数)。

    • 在此方法中,你可以通过所有动作侦听迭代 和 删除它们。我认为这是更好的 设计,如果你这样做,而不是 客户端类。
  2. 如果你不想这样做,那么我认为汤姆霍金建议在你的ButtonListener中使用状态是一个好主意。

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

    • Map<JButton, ButtonListener>(如果总是只打算为每一个按钮收听),或
    • Map<JButton, List<ButtonListener>>(如果有可能,每个按钮多个监听器)是我可能会使用的东西。

我想方法和是优选的,方法表示设计不良(但更容易一起劈)。

需要注意的是,如果你确实使用方法,或类似的东西,请检查您正在访问的方法或属性是线程安全的(如OscarRyz提到的),如果没有,用​​保证线程安全。