检测 JRadioButton 状态更改

Posted

技术标签:

【中文标题】检测 JRadioButton 状态更改【英文标题】:Detecting a JRadioButton state change 【发布时间】:2010-11-28 07:49:32 【问题描述】:

当使用鼠标单击时,如何检测 JRadioButton 何时从“未选择”更改为“已选择”?我尝试在按钮上使用 ActionListener,但是每次单击单选按钮时都会触发它,而不仅仅是在将状态更改为“已选择”时。

我曾考虑维护一个布尔变量来记住按钮的状态,并在 ActionListener 中对其进行测试以查看是否更改其状态,但我想知道是否有更好或更清洁的解决方案。

【问题讨论】:

是的,ActionListner 通常是它的完成方式。每个人都知道如何编写 ActionListener,因为它很常见。代码将简单地使用按钮的 isSelected() 方法。 ItemListener 也会触发多次,因此您必须检查 ItemEvent 以查看此事件是选择还是取消选择。我会坚持使用更常见的方法。 使用这样的 ActionListener 仍然不起作用,因为每次单击单选按钮时 isSelected() 都会返回 true,这就是我最初的问题。 在 XP 上使用 JDK6 对我来说效果很好。如果 ChangeListener 告诉您状态已更改,那么最好更改状态,否则您有大问题。发布显示问题的 SSCCE。 @camickr,您在第一条评论中告诉他使用 ActionListener,然后当他解释存在问题时,您的评论就像您告诉他使用 ChangeListener 一样。如下所述,这两个听众都有问题。 【参考方案1】:

看看JRadioButton.addItemListener()

编辑:您不太可能想要使用 changeListener,因为它每次点击都会触发多次。 itemListener 每次点击只触发一次。 See here

EDIT2:只是为了扩展这一点,每次用户点击它时,jradioButton 上的 actionListener 都会触发,即使它已经被选中。如果那是你想要的,很好,但我觉得这很烦人。我只想收到它被选中或取消选中的通知。

ChangeListener 会针对各种情况触发,这意味着您的侦听器每次点击都会收到 5 个或更多事件。不好。

itemlistener 仅在选中或取消选中状态发生变化时触发。这意味着用户可以多次单击它,如果它不改变它就不会触发。在您的处理程序方法中,您必须有一个 if 块检查 SELECTEDDESELECTED 状态并在那里做任何事情:

@Override
public void itemStateChanged(ItemEvent e) 
    if (e.getStateChange() == ItemEvent.SELECTED) 
        // Your selected code here.
    
    else if (e.getStateChange() == ItemEvent.DESELECTED) 
        // Your deselected code here.
    

它只是工作得更好,因为你知道如果你在方法中,那么单选按钮要么被选中要么被取消选中,而不是用户只是出于某种未知原因在界面上敲打。

【讨论】:

这很好用——尽管 Sun 文档说明“通常,您使用动作侦听器处理单选按钮单击”。谢谢! 如果您可以向ButtonGroup 添加一个监听器,该监听器只会在组内的JRadioButton 更改时触发一次。 @Nemi 抱歉,编辑链接已失效。你能提供如何使用这种方法吗? @AbrahamPutraPrakasa 抱歉,经过这么长时间,我什至不确定我链接到了什么。可以说,EDIT2 部分概述了我想说的关于每次点击多次触发 ChangeListener 的所有内容。 已更改回路机器的链接【参考方案2】:

我相信你想添加一个ChangeListener 实现。

【讨论】:

正如我在帖子中提到的,每次点击添加 ChangeListener 会触发多次,这不太可能是最佳选择。

以上是关于检测 JRadioButton 状态更改的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 JRadioButton 在这种情况下不起作用?

如何检测何时加载通过道具提供的图像并更改 React 中的状态?

iOS 扩展 - 检测“扩展状态更改”(背景/前景)

是否可以检测状态栏时钟上的“分钟”何时更改?

更改文本字段的禁用状态时获取`AttributeGraph:循环检测`错误

如何检测哪个 div 在更改时处于活动状态?