我创建了一个JFrame。这个JFrame包含一个JLabel,它包含一些JButtons。 JButtons有一个ActionListener(称为MainFrameListener)。单击arrowButton
按钮时,代码将执行一个方法。此方法使用foodButton.removeActionListener(new MainFrameListener());
但是虽然我删除了Listener,但Button仍然有两个按钮。 当然我已经在互联网上搜索以解决问题,我发现了一行代码,显示了一个按钮的监听器数量。
System.out.println("Count of listeners: " + ((JButton) e.getSource()).getActionListeners().length);
我第一次点击按钮Java说有两个按钮。当我点击arrowButton
时,另一个菜单打开,按钮被删除。这就像我想要的那样。当我点击arrowBackButton
时,应用程序会将我发回给MainFrame。那是完美的。但当我再次点击arrowButton
时,控制台说我有两个注册按钮的监听器。点击时发出的声音会播放两次。
我不明白,因为我删除了听众。有没有更好的方法来删除监听器?
答案 0 :(得分:3)
foodButton.removeActionListener(new MainFrameListener());
不会删除任何内容,因为您要删除一个从未添加到foodButton
的新创建的对象。保持对您的监听器的引用,并在以后删除它:
MainFrameListener listener = new MainFrameListener();
foodButton.addActionListener(listener);
//and later somewhere else
foodButton.removeActionListener(listener);
但我的建议是首先避免添加/删除侦听器。