【问题标题】:Handle RadioButton events after button clicked单击按钮后处理 RadioButton 事件
【发布时间】:2013-12-02 16:31:26
【问题描述】:

帮助, 我的问题是:

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

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

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

感谢您的帮助!

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

                }

            }
    }

【问题讨论】:

  • 对于每个示例的刷新按钮,您可以执行if(e.getSource() == refresh)

标签: java swing jpanel jradiobutton buttongroup


【解决方案1】:

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

ButtonHandler 仅与 ActionListener 一起实现:

  public class ButtonHandler implements ActionListener{}

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


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

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

        @Override
        public void itemStateChanged(ItemEvent e) {

            if(e.getSource() instanceof JCheckBox)
            { 
                JCheckBox  checkBox = (JCheckBox)e.getSource();
                if(checkBox.getName().equals("expectedName"))
                          ; // do my thing
             }
        }

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

您正在使用ButtonGroupButtonGroup 有一个很好的功能:clearSelection() 可以帮助您解决任何问题(我无法理解部分:运行构造函数部分)。

编辑:正如您希望我看到 ItemListener 实现的类,是的,我可以看到但是:

  1. 在对ButtonHandler 注册到的组件执行任何操作之前,我看不到您实际上已将该类的实例(a1.addItemListener(handler);)注册到任何组件:checkMe, refresh
  2. 除此之外,在此操作执行的功能中,您正在检查 action 命令,你甚至没有用JButton.setActionCommand(String) 函数设置它。 您不应根据另一个 (Action) 侦听器的事件发生来分配 (Item) 侦听器。

教程:

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

【讨论】:

  • 如你所见,我有一个实现 ItemListener 的类:公共类 RadioButtonHandler 实现 ItemListener 所以你对第一个问题的回答对我没有帮助
  • 请检查编辑。并尝试在将来使您的问题简短。我花了将近半个小时来写这篇文章。您可能想争辩说我可能缺乏技能,但由于我没有看到任何其他解决您的问题的答案,因此可以安全地假设每个人都避免了您的问题,因为它的规模很大
猜你喜欢
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多