我创建了一个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);


但是我的建议是避免一开始就添加/删除侦听器。

09-27 07:43