Java 单击按钮后处理RadioButton事件

Java 单击按钮后处理RadioButton事件,java,swing,jpanel,jradiobutton,buttongroup,Java,Swing,Jpanel,Jradiobutton,Buttongroup,救命啊,, 我的问题是: 为什么没有触发itemStateChanges,我试着把它放在内部类ButtonHandler中,也放在RadioButtonHandler中,我遇到了问题,正确的方法是什么? 我想在用户单击“检查”按钮后触发并检查标记的JRadioButtons 检查单击哪个按钮的正确方法是什么,我觉得比较字符串是不好的编程实践。也许用身份证 如何创建“重置”按钮(重新开始),我想取消选中所有单选按钮并再次运行构造函数 谢谢你的帮助 import java.awt.*; import

救命啊,, 我的问题是:

  • 为什么没有触发
    itemStateChanges
    ,我试着把它放在内部类
    ButtonHandler
    中,也放在
    RadioButtonHandler
    中,我遇到了问题,正确的方法是什么? 我想在用户单击“检查”按钮后触发并检查标记的JRadioButtons

  • 检查单击哪个按钮的正确方法是什么,我觉得比较字符串是不好的编程实践。也许用身份证

  • 如何创建“重置”按钮(重新开始),我想取消选中所有单选按钮并再次运行构造函数

  • 谢谢你的帮助

    import java.awt.*;
    import java.awt.event.*;
    import java.util.ArrayList;
    
    import javax.swing.*;
        public class ExamFrame extends JFrame {
    
            static ArrayList<Question> qArrList;
            JRadioButton a1,a2,a3,a4;
            public ExamFrame() {
                super("Quiz");
    
                setLayout(new GridLayout(0, 1));
                GridBagConstraints gbc = new GridBagConstraints();
    
                Exam exam = new Exam();
                qArrList = exam.getExam();
                int count=0;
                for(Question q : qArrList){
                    count++;
                    JLabel questionLabel = new JLabel(count+". "+q.getQustion()); //swing constant ?
                    ArrayList<String> ansRand = q.getAllRandomAns();
                    a1 = new JRadioButton(ansRand.get(0)); 
                    a2 = new JRadioButton(ansRand.get(1));
                    a3 = new JRadioButton(ansRand.get(2));
                    a4 = new JRadioButton(ansRand.get(3));
                    add(questionLabel);
                    add(a1);add(a2,gbc);add(a3);add(a4);
    
                    ButtonGroup radioGroup = new ButtonGroup(); //logical relationship
                    radioGroup.add(a1);radioGroup.add(a2);radioGroup.add(a3);radioGroup.add(a4);
                }
                //buttons:
                JButton checkMe = new JButton("Check Exam");
                JButton refresh = new JButton("Start Over");
                ButtonHandler handler = new ButtonHandler();
                checkMe.addActionListener(handler);
                refresh.addActionListener(handler);
                add(checkMe);
                add(refresh);
    
            }
                /** Listens to the radio buttons. */
                public class ButtonHandler implements ActionListener
                {
                    public void actionPerformed (ActionEvent e) {
                        if(e.getActionCommand().equals("Start Over")){ //id?
                            //how to do this?
    
                        }
                        else{
                            RadioButtonHandler handler = new RadioButtonHandler();
                            a1.addItemListener(handler);
                            System.out.println("success?");
                        }
                        JOptionPane.showMessageDialog(ExamFrame.this, String.format("You pressed: %s", e.getActionCommand()));
                    }
                    public void itemStateChanged(ItemEvent e) //can i add it here?
                    {
                        JOptionPane.showMessageDialog(ExamFrame.this, String.format("yes?"));
                        System.out.println("success!");
                    }
    
                }
                public class RadioButtonHandler implements ItemListener
                {
                    public void itemStateChanged(ItemEvent e)
                    {
                        JOptionPane.showMessageDialog(ExamFrame.this, String.format("radio state changed"));
    
                    }
    
                }
        }
    
    import java.awt.*;
    导入java.awt.event.*;
    导入java.util.ArrayList;
    导入javax.swing.*;
    公共类ExamFrame扩展了JFrame{
    静态ArrayList-qArrList;
    JRadioButton a1、a2、a3、a4;
    公共ExamFrame(){
    超级(“测验”);
    setLayout(新的GridLayout(0,1));
    GridBagConstraints gbc=新的GridBagConstraints();
    考试=新考试();
    qArrList=exam.getExam();
    整数计数=0;
    关于(问题q:qArrList){
    计数++;
    JLabel questionLabel=newjlabel(count+“+q.getQustion());//swing常量?
    ArrayList ansRand=q.getAllRandomAns();
    a1=新的JRadioButton(ansRand.get(0));
    a2=新的JRadioButton(ansRand.get(1));
    a3=新的JRadioButton(ansRand.get(2));
    a4=新的JRadioButton(ansRand.get(3));
    添加(问题标签);
    增补(a1);增补(a2,gbc);增补(a3);增补(a4);
    ButtonGroup radioGroup=新建ButtonGroup();//逻辑关系
    射线组添加(a1);射线组添加(a2);射线组添加(a3);射线组添加(a4);
    }
    //按钮:
    JButton checkMe=新JButton(“检查检查”);
    JButton refresh=新JButton(“重新开始”);
    ButtonHandler处理程序=新建ButtonHandler();
    checkMe.addActionListener(处理程序);
    addActionListener(处理程序);
    添加(检查我);
    添加(刷新);
    }
    /**听单选按钮*/
    公共类ButtonHandler实现ActionListener
    {
    已执行的公共无效操作(操作事件e){
    如果(例如getActionCommand().equals(“重新开始”){//id?
    //如何做到这一点?
    }
    否则{
    RadioButtonHandler处理程序=新的RadioButtonHandler();
    a1.addItemListener(处理程序);
    System.out.println(“成功?”);
    }
    JOptionPane.showMessageDialog(ExamFrame.this,String.format(“您按下了:%s”,例如getActionCommand());
    }
    public void itemStateChanged(ItemEvent e)//我可以在这里添加它吗?
    {
    showMessageDialog(ExamFrame.this,String.format(“是?”);
    System.out.println(“成功!”);
    }
    }
    公共类RadioButtonHandler实现ItemListener
    {
    公共无效itemStateChanged(ItemEvent e)
    {
    showMessageDialog(ExamFrame.this,String.format(“无线电状态已更改”);
    }
    }
    }
    
    为什么“itemStateChanges”没有被触发,我试着把它放在内部 类“ButtonHandler”和“RadioButtonHandler”中,我有 遇到麻烦时,正确的方法是什么?我想触发 并在用户单击“检查”后检查标记的JRadioButtons 按钮

    ButtonHandler
    仅通过
    ActionListener
    实现:

      public class ButtonHandler implements ActionListener{}
    
    itemStateChanged(ItemEvent)
    函数属于
    ItemListener
    。如果此侦听器注册到的源组件的状态发生更改,则会触发此函数。因此,实现
    itemstener
    。然而,还有一件事需要注意,
    JButton
    不会响应
    itemstener
    ,但是
    JRadioButton
    会响应。因为此
    事件由实现
    项可选择
    接口的组件触发。此类组件的一些示例包括:复选框、复选菜单项、切换按钮和组合框,包括上述单选按钮


    我觉得,检查哪个按钮被点击的正确方法是什么 比较字符串是错误的编程。也许用身份证

    使用事件源函数:
    e.getSource()
    ,检查源的类型是否为您期望的类型,并将其转换为适当的类型。然后您可以使用
    getName(String)
    函数检查您期望的名称。当然,在初始化组件之后,应该使用
    setName(String)
    分配名称。或者,如果组件引用是在类上下文中声明的,并且您可以直接访问该组件,则直接使用该组件引用

            @Override
            public void itemStateChanged(ItemEvent e) {
    
                if(e.getSource() instanceof JCheckBox)
                { 
                    JCheckBox  checkBox = (JCheckBox)e.getSource();
                    if(checkBox.getName().equals("expectedName"))
                              ; // do my thing
                 }
            }
    

    我应该如何做一个“重置”按钮(重新开始),我想取消选中所有 单选按钮,然后再次运行构造函数

    您正在使用
    按钮组
    。而且
    ButtonGroup
    有一个很好的功能:帮助你做任何你想做的事情(我不理解部分:运行构造函数部分)

    Edit:您希望我看到一个
    itemstener
    实现的类,是的,我可以看到,但是:

  • 在对注册了
    ButtonHandler
    的组件执行任何操作之前,我看不出您是否已将该类的实例(
    a1.addItemListener(handler);
    )注册到任何组件:
    检查我,刷新
  • 另外