1

知っている; これは悪化していて、私は可能な解決策を考え出そうとしました。基本的に、私のプログラムは、1つだけを開く必要があるときに複数のアプレットを開き、必要なランダムな数学の質問を表示しません。これは私が持っているコードです:

package RandomMathGame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class RandomMathGame {

    public static void main(String[] args) {
        RandomProblemGenerator randomProblems = new RandomProblemGenerator(10);
        final int numberProblems = 10;
        int correctScore = 0;
        JPanel panel = new JPanel();
        JPanel[] questionPanel = new JPanel[numberProblems];
        JPanel mainQuestionPanel = new JPanel();
        JPanel mainPanel = new JPanel();
       int answer;
        int correctAnswer;
        JLabel[] mathProblems = new JLabel[numberProblems];
        final JTextField[] mathAnswers = new JTextField[numberProblems];
        JLabel[] correctYesNo = new JLabel[numberProblems];
        final JLabel score = new JLabel(correctScore + "/10");
        JButton submit = new JButton("Submit");

        mainQuestionPanel.setLayout(new GridLayout(1, 10));

        for (int i = 1; i <= numberProblems; i++)
        {
            final int X = randomProblems.createNumberX();
            final int Y = randomProblems.createNumberY();

            mathProblems[i] = new JLabel("" + X + " * " + Y + " = ");
            mathAnswers[i] = new JTextField();

         String answerStr = mathAnswers[i].getText();

    if(answerStr.isEmpty()){

          correctYesNo[i] = new JLabel("Not a valid answer/answer field empty!");
    } else {

             answer = Integer.parseInt(mathAnswers[i].getText());
             correctAnswer = X * Y;

            if (answer == correctAnswer)
            {
                correctYesNo[i] = new JLabel("Correct answer; good job!");
                correctScore = correctScore + 1;
            }
            else
            {
               correctYesNo[i] = new JLabel("Incorrect answer; try again!");

            }
             questionPanel[i].add(mathProblems[i]);
             questionPanel[i].add(mathAnswers[i]);
             questionPanel[i].add(correctYesNo[i]);
             mainQuestionPanel.add(questionPanel[i]);
            }

        final int temp = correctScore;
      submit.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                score.setText("Score: " + temp + "/10");
            }
        });



        panel.add(submit);
        panel.add(score);
        mainPanel.setLayout(new GridLayout(1, 2));
        mainPanel.add(mainQuestionPanel);
        mainPanel.add(panel);
        JFrame gameFrame = new JFrame();
        gameFrame.setTitle("Random Math Game");
        gameFrame.setSize(1000, 1000);
        gameFrame.setVisible(true);
        gameFrame.setContentPane(mainPanel);



        }
  }
}
4

2 に答える 2

2

問題はgameFrame、forループ内でが作成(および表示)されることです。gameFrameオブジェクトを作成する前に、ループを閉じてみてください。

于 2012-07-10T04:47:22.633 に答える
1

複数のフレームは、次のforループによって発生します。

for (int i = 1; i <= numberProblems; i++)
{
...

作成後は閉じてJFrameいるので、複数作成します。おそらくここで閉じる必要があります:

    final int temp = correctScore;
    submit.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            score.setText("Score: " + temp + "/10");
        }
    });
}  // <- CLOSE THE FOR LOOP HERE

panel.add(submit);

ただし、ループからはまだArrayIndexOutOfBoundsExceptionスローされる可能性があります(少なくとも私の非常に簡単な実験では)。

これは、存在しない配列インデックスへのアクセスを要求していることを意味します。たとえば、配列の長さが4要素で、要素が必要です[16]。私がこれをトラブルシューティングするほど大胆であるかもしれないならば、私はそれがから来ていると思いますi <= numberProblems。おそらくそうあるべきi < numberProblemsです。

配列のインデックス付けは0から始まるため、最後の要素はでtheArray.length - 1はなく、になりますtheArray.length

于 2012-07-10T04:46:30.330 に答える