Java Swing:如何从组件中删除匿名ActionListener
我创建了一个带有匿名ActionListeners
的JButtons
数组,在某些条件下我想删除所有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
。
我理解你的问题,并且正如其他人所建议的那样,遍历所有操作,来自客户端类的监听器可以解决你的直接问题。
-
在这种情况下H / W,你真正想要做的是扩展JButton的function,这是解决这个问题的一种方法 – 扩展JButton并添加一个名为
removeAllActionListeners()
的方法(它不带任何参数) 。- 在此方法中,您可以遍历所有动作侦听器并将其删除。 我认为如果你在这里做比在客户端类中更好的设计。
-
如果您不想这样做,那么我认为Tom Hawtin建议在ButtonListener中使用state是一个好主意。
-
如果不这样做,你总是可以选择退回一个非常“hacky”的方式,即在你的客户端类中存储一组动作监听器。
-
Map
(如果每个按钮总是只有一个监听器),或者 -
Map
(如果每个按钮可以有多个侦听器)就是我可以使用的。>
-
我认为方法1和2是优选的,方法3表示设计差(但更容易一起破解)。
请注意,如果您确实使用方法1或类似的方法,请检查您正在访问的方法或属性是否是线程安全的(如OscarRyz所述),如果不是,请使用synchronized
来确保线程安全。
你不能。 没有人引用这些对象。 为了能够删除它们,您需要将其作为数据成员/变量存储在代码中,然后将该变量传递给removeActionListener()
方法。 但是,您可以使用getActionListeners()
方法获取与Button
关联的所有ActionListener
对象的数组。 然后你需要确定要删除哪一个,但如果只有一个,那应该很容易;-)