我创建了一个JFrame。这个JFrame包含一个JLabel,它包含一些JButtons。 JButtons有一个ActionListener(称为MainFrameListener)。单击arrowButton
按钮时,代码将执行一个方法。此方法使用foodButton.removeActionListener(new MainFrameListener());
从旧按钮中删除所有ActionListener
但是虽然我删除了Listener,但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);
但我的建议是避免首先添加/删除侦听器。