我创建了一个JFrame。该JFrame包含一个JLabel,其中包含一些JButton。 JButton具有一个ActionListener(称为MainFrameListener)。单击arrowButton
按钮时,代码将执行一个方法。此方法使用foodButton.removeActionListener(new MainFrameListener());
从旧的Button中删除所有ActionListeners
但是,尽管我删除了监听器,但Button仍然有两个按钮。
当然,我已经在Internet上进行搜索以解决此问题,并且发现一行代码显示了一个Button的侦听器数量。
System.out.println("Count of listeners: " + ((JButton) e.getSource()).getActionListeners().length);
我第一次单击按钮时,Java表示有两个按钮。当我单击
arrowButton
时,另一个菜单打开,并且按钮被删除。就像我想要的那样。当我单击arrowBackButton
时,应用程序将我发送回MainFrame。那很完美。但是,当我再次单击arrowButton
时,控制台会说我为按钮注册了两个侦听器。喀哒声响了两次。我不明白,因为我删除了监听器。有没有更好的方法来删除侦听器?
最佳答案
foodButton.removeActionListener(new MainFrameListener());
不会删除任何内容,因为您要删除从未添加到foodButton
的新创建的对象。保留对您的侦听器的引用,并稍后将其删除,如下所示:
MainFrameListener listener = new MainFrameListener();
foodButton.addActionListener(listener);
//and later somewhere else
foodButton.removeActionListener(listener);
但是我的建议是避免一开始就添加/删除侦听器。