我认为证明这一点的最好方法是使用一个可编辑的例子。我想要一组表现如此的单选按钮(一次只能选择一个);但是,当再次“选择”当前选中的单选按钮时,清除选择(就像我猜的复选框一样)。
我的实现检查单选按钮的状态,如果选中,则清除选择(模仿“取消选择”,如复选框)。问题是,单选按钮的选择状态在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);
}
}
答案 0 :(得分:2)
你需要结合项目监听器和动作监听器来实现这一点,通过观察事件序列,如果“事件”发生在“项目事件”之后,那就是清除按钮组选择的时间。
以下代码适合我。
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;
}
}
}
答案 1 :(得分:1)
这是JRadioButton和JCheckBox的常见问题,有时另一个JButtons JComponents,这些事件must be wrapped into invokeLater()
最好仅使用ItemListener,因为已触发完整事件SELECTED
和DESELECTED