gpt4 book ai didi

java - 我无法确定此 JRadioButton 功能的语义

转载 作者:行者123 更新时间:2023-11-29 06:01:35 26 4
gpt4 key购买 nike

我认为最好的证明方法是使用一个可编译的示例。我想要一组这样的单选按钮(一次只能选择一个);然而,当当前选择的单选按钮再次被“选择”时,选择被清除(我猜就像一个复选框)。

我的实现检查单选按钮的状态,如果选中,则清除选择(模拟复选框的“取消选择”)。问题是,单选按钮的选择状态在 ActionEvent 触发之前发生变化,因此无论它是否已被选中,isSelected() 都会返回 true。一种解决方案是在任何 ActionEvent 触发之前基本上记录 ButtonGroup 的选定按钮,尽管我的程序不像那样通灵:(我怀疑我可以使用 MouseListener 轻松实现它,尽管这会限制功能鼠标使用,我可以使用键盘等 :) 感谢您的指点!

演示:

package sandbox;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JRadioButton;

public class Sandbox {

public static void main(String[] args) {
JFrame f = new JFrame();
final ButtonGroup btns = new ButtonGroup();
final JRadioButton btn1 = new JRadioButton("Button 1");
final JRadioButton btn2 = new JRadioButton("Button 2");
btns.add(btn1);
btns.add(btn2);
ActionListener al = new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof JRadioButton) {
btns.clearSelection();
}
}

};
btn1.addActionListener(al);
btn2.addActionListener(al);
f.setLayout(new FlowLayout());
f.add(btn1);
f.add(btn2);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}

}

最佳答案

需要结合item listener和action listener来实现,通过观察事件顺序,如果“action event”发生在“item event”之后,就是清除按钮组选择的时间。

以下代码对我有用。

public class JRadioButtonTest {

public static void main(String[] args) {
JFrame f = new JFrame();
final ButtonGroup btns = new ButtonGroup();
final JRadioButton btn1 = new JRadioButton("Button 1");
final JRadioButton btn2 = new JRadioButton("Button 2");
btns.add(btn1);
btns.add(btn2);
EventAdapter ea = new EventAdapter(btns);
btn1.addActionListener(ea);
btn2.addActionListener(ea);
btn1.addItemListener(ea);
btn2.addItemListener(ea);

f.setLayout(new FlowLayout());
f.add(btn1);
f.add(btn2);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}

public static class EventAdapter implements ActionListener, ItemListener
{
private ButtonGroup bg;

boolean itemStateChanged = false;

public EventAdapter(ButtonGroup bg)
{

this.bg = bg;
}


@Override
public void itemStateChanged(ItemEvent itemEvent) {
itemStateChanged = true;
}

@Override
public void actionPerformed(ActionEvent e) {
if (!itemStateChanged)
{
System.out.println("UnSelected");
bg.clearSelection();
}
itemStateChanged = false;
}

}

}

关于java - 我无法确定此 JRadioButton 功能的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9914586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com