ActionListener调用了两次,添加了Once

问题描述 投票:0回答:1

我创建了一个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时,控制台说我有两个注册按钮的听众。点击时发出的声音播放两次。

我不明白,因为我删除了听众。有没有更好的方法来删除监听器?

java swing awt actionlistener
1个回答
3
投票

foodButton.removeActionListener(new MainFrameListener());不会删除任何东西,因为你要删除一个从未添加到foodButton的新创建的对象。保持对您的侦听器的引用,并在以后删除它,如下所示:

MainFrameListener listener = new MainFrameListener();
foodButton.addActionListener(listener);
//and later somewhere else
foodButton.removeActionListener(listener);

但我的建议是避免首先添加/删除侦听器。

© www.soinside.com 2019 - 2024. All rights reserved.