1

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

我的实现检查单选按钮的状态,如果选中,则清除选择(模拟复选框的“取消选择”)。问题是,单选按钮的选择状态在ActionEvent触发之前发生了变化,因此isSelected()无论它是否已经被选中都返回 true。一种解决方案是在任何 ActionEvent 触发之前基本上记录 ButtonGroup 的选定按钮,尽管我的程序不是那样的 :( 我怀疑我可以使用 a 轻松实现这一点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);
    }

}
4

2 回答 2

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;
    }

}

}
于 2012-03-28T21:11:10.310 回答
1
于 2012-03-28T20:07:56.567 回答