我无法确定这个JRadioButton功能的语义

时间:2012-03-28 19:46:20

标签: java swing jradiobutton buttongroup

我认为证明这一点的最好方法是使用一个可编辑的例子。我想要一组表现如此的单选按钮(一次只能选择一个);但是,当再次“选择”当前选中的单选按钮时,清除选择(就像我猜的复选框一样)。

我的实现检查单选按钮的状态,如果选中,则清除选择(模仿“取消选择”,如复选框)。问题是,单选按钮的选择状态在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);
    }

}

2 个答案:

答案 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)