-1

グランプリ/パインウッドダービーのようなレースのラインナップを作成し、スコアが入力されるとファイナリストを見つけてレーン/ヒート番号を割り当てるJavaプログラムを作成しています。

これまでのところ、ファイナリストを作成しようとしている部分に到達するまで、プログラムのすべてが私がやりたいことを正確に実行します。ボタンをクリックして Enter キーを押して最終スコアを入力すると、GUI がフリーズします。フリーズする直前のコードは次のとおりです。

//allows user to enter the places for each car in each heat in each round
void enterScores() {
    if(indexCount == 0 || (indexCount) % numLanes == 0) {
        textArea.append("\nRound " + (roundCount + 1) + " Heat " + (heatCount+1) + ": ");
    }
    userResponse.setText("");
    prompt.setText(holderNameArray[roundCount][indexCount] + ": ");
    textArea.append("\n" + holderNameArray[roundCount][indexCount] + ": ");
    userResponse.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            holderScoreArray[roundCount][indexCount] = Integer.parseInt(userResponse.getText());
            textArea.append("" + holderScoreArray[roundCount][indexCount]);
            indexCount++;
            for(ActionListener act : enter.getActionListeners()) {
                enter.removeActionListener(act);
            }
            for(ActionListener act : userResponse.getActionListeners()) {
                            userResponse.removeActionListener(act);
                        }
            repeatEnterScores();
        }
    });
    enter.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            holderScoreArray[roundCount][indexCount] = Integer.parseInt(userResponse.getText());
            textArea.append("" + holderScoreArray[roundCount][indexCount]);
            indexCount++;
            for(ActionListener act : enter.getActionListeners()) {
                enter.removeActionListener(act);
            }
            for(ActionListener act : userResponse.getActionListeners()) {
                            userResponse.removeActionListener(act);
                        }
            repeatEnterScores();
        }
    });

}
//helps repeat enterScores() due to anon class restrictions
//checks to change the number of heats/rounds
void repeatEnterScores() {
    if((indexCount) % numLanes == 0 || indexCount == numCars) {
        heatCount++;
    }
    if(indexCount == numCars) {
        indexCount = 0;
        heatCount = 0;
        roundCount++;
    }
    if(roundCount < numRounds) {
        enterScores();
    } else {
        textArea.setText("You may now click the Scores tab to see the scores you have just entered.");
        scoresPanelSetup();
    }
}

以前はフリーズして続行するのではなく、後でフリーズしていました。私は初心者なので、なぜ今ここでフリーズしているのかわかりません。さらにコード/情報が必要な場合は、お知らせください。デバッグするたびに、すべてのコードを正常に実行できますが、GUI に問題があるだけです。

ありがとう!

4

1 に答える 1

1

EDT (イベント ディスパッチ スレッド) で長い操作を実行しようとすると、GUI がハングすることがあります。これは、SwingWorker を使用することで回避できます。SwingWorker には doInBackground() と done() の 2 つのメソッドがあります。doInBackground() メソッドで計算を行い、done() メソッドで UI を更新する必要があります。SwingWorker の詳細については、 http: //docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html を参照してください。

于 2013-09-15T23:59:04.830 に答える