单击按钮后处理RadioButton事件

时间:2013-12-02 16:31:27

标签: java swing jpanel jradiobutton buttongroup

帮助, 我的问题是:

  1. 为什么itemStateChanges没有被触发,我试图把它放在内部班ButtonHandlerRadioButtonHandler我遇到问题,这是正确的方法去做吧? 我想在用户点击“检查”按钮后触发并检查标记的JRadioButtons。

  2. 检查点击哪个按钮的正确方法是什么,我觉得比较字符串是不好的编程习惯。也许使用ID?

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

  4. 感谢您的帮助!

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

1 个答案:

答案 0 :(得分:3)

  

为什么“itemStateChanges”没有被触发,我试图把它放在内部   类“ButtonHandler”以及“RadioButtonHandler”我有   麻烦,做正确的方法是什么?我想触发   用户点击“检查”后检查标记的JRadioButtons   按钮。

ButtonHandler仅与ActionListener实施:

  public class ButtonHandler implements ActionListener{}

itemStateChanged(ItemEvent)函数属于ItemListener。如果注册此侦听器的源组件的状态发生更改,则会触发此函数。所以实现ItemListener。但是,还有一点需要注意,JButton不响应ItemListener,而JRadioButton会响应Item。因为实现ItemSelectable接口的组件会触发此e.getSource()事件。这些组件的一些示例是:复选框,检查菜单项,切换按钮和组合框,包括如上所述的单选按钮


  

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

使用事件源函数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

  

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

您正在使用ButtonGroupItemListener有一个很好的功能:clearSelection()可以帮助你做任何事情(我无法理解这部分:运行构造函数部分)。

编辑:您希望我看到a1.addItemListener(handler);已实施的课程,是的,我可以看到但是:

  1. 在对ButtonHandler注册到的组件执行任何操作之前,我无法看到您实际向任何组件注册了该类的实例(checkMe, refresh):JButton.setActionCommand(String)
  2. 除此之外,在此动作执行的功能中,您正在检查 动作命令,您甚至没有使用{{1}}功能设置。 您不应根据另一个(Action)侦听器的事件发生来分配(Item)侦听器。
  3. <强>教程:

    1. How to Write an ItemListener
    2. How to Write an ActionListener
    3. How to Use the ButtonGroup Component