0

助けて、私の質問は次のとおりです。

  1. なぜitemStateChangesトリガーされないのですか、私はそれを内部クラスに入れようとしましたがButtonHandlerRadioButtonHandlerそれで問題が発生しました。それを行う正しい方法は何ですか? ユーザーが「チェック」ボタンをクリックした後、マークされた JRadioButtons をトリガーしてチェックしたいと思います。

  2. どのボタンがクリックされたかを確認する正しい方法は何ですか。文字列を比較するのは悪いプログラミング慣行だと思います。たぶんIDを使用していますか?

  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ます。ただし、もう 1 つ注意すべき点があります。これJButtonは応答しませんが、応答します。このイベントは、インターフェイスを実装するコンポーネントによって発生するためです。このようなコンポーネントの例としては 、チェック ボックス、チェック メニュー項目、トグル ボタン、および前述のラジオ ボタンを含むコンボ ボックスがあります。ItemListenerJRadioButtonItemItemSelectable


どのボタンがクリックされたかを確認する正しい方法は何ですか。文字列を比較するのは間違ったプログラミングだと思います。たぶん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
             }
        }

「リセット」ボタンを作成するにはどうすればよいですか(最初からやり直す)、すべてのラジオボタンのチェックを外して、コンストラクターをもう一度実行したいです。

さて、あなたはで働いていButtonGroupます。そしてButtonGroup、素晴らしい機能があります:あなたが望むものならclearSelection()何でも(私はその部分を理解できませんでした:コンストラクター部分を実行します)を助けます。

編集:実装されたクラスを見てほしいと思ったのでItemListener、はい、それを見ることができますしかし:

  1. a1.addItemListener(handler);登録されているコンポーネントでアクションを実行する前に、そのクラス()のインスタンスを実際にコンポーネントに登録したことがわかりませんButtonHandlercheckMe, refresh
  2. それに加えて、このアクション実行関数では、JButton.setActionCommand(String)関数で設定さえしていないアクションコマンドでチェックしています。別の (アクション) リスナーのイベント発生に応じて (アイテム) リスナーを割り当てる必要はありません。

チュートリアル:

  1. ItemListener の書き方
  2. ActionListener の書き方
  3. ButtonGroup コンポーネントの使用方法
于 2013-12-02T17:08:52.183 に答える