0

帮助,我的问题是:

  1. 为什么没有被itemStateChanges触发,我试图把它放在内部类ButtonHandler中,并且RadioButtonHandler我也遇到了麻烦,正确的方法是什么?我想在用户单击“检查”按钮后触发并检查标记的 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"));

                }

            }
    }
4

1 回答 1

3

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

ButtonHandler仅通过以下方式实现ActionListener

  public class ButtonHandler implements ActionListener{}

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


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

使用事件源函数: 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. 并且ButtonGroup有一个很好的功能:clearSelection()帮助你想要的任何东西(我无法理解部分:运行构造函数部分)。

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

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

教程:

  1. 如何编写一个 ItemListener
  2. 如何编写 ActionListener
  3. 如何使用 ButtonGroup 组件
于 2013-12-02T17:08:52.183 回答