【问题标题】:ActionListener called twice, added OnceActionListener 调用了两次,添加了一次
【发布时间】:2018-06-07 14:19:15
【问题描述】:

我创建了一个 JFrame。这个 JFrame 包含一个 JLabel,其中包含一些 JButton。 JButton 有一个 ActionListener(称为 MainFrameListener)。单击arrowButton 按钮时,代码将执行一个方法。此方法从带有 foodButton.removeActionListener(new MainFrameListener()); 的旧按钮中删除所有 ActionListeners

虽然我删除了监听器,但按钮仍然有两个按钮。 当然,我已经在互联网上搜索以解决问题,我发现一行代码显示了一个按钮的侦听器数量。

System.out.println("Count of listeners: " + ((JButton) e.getSource()).getActionListeners().length);

我第一次点击按钮时 Java 说有两个按钮。当我单击arrowButton 时,会打开另一个菜单并删除按钮。这就是我想要的。当我单击arrowBackButton 时,应用程序将我发送回 MainFrame。那很完美。但是当我再次单击arrowButton 时,控制台说我有两个为按钮注册的侦听器。并且点击时发出的声音会播放两次。

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

【问题讨论】:

  • 给新手的好问题,欢迎投票 ;-)

标签: java swing awt actionlistener


【解决方案1】:

foodButton.removeActionListener(new MainFrameListener()); 不会删除任何内容,因为您正在删除一个从未添加到 foodButton 的新创建的对象。保留对您的侦听器的引用,然后像这样删除它:

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

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

【讨论】:

  • 哦,谢谢。我不知道我需要一个监听器实例。现在效果很好:D
猜你喜欢
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 2015-06-03
  • 2020-11-23
  • 2017-06-25
  • 2013-01-21
相关资源
最近更新 更多