0

テキスト ボックスに何かを入力すると、Enter キーを押すとアプリケーションがフリーズして応答しなくなります。1 から 100 までの数字を取得するゲームです。Enter キーに送信ボタンまたは ActionListener が必要だと思います。誰かがこれを手伝ってくれますか。また、FlowLayout で改行する方法はありますか? それとも別のレイアウトが良いですか?これが私のコードです:

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;


public class game extends JFrame {

    private static final long serialVersionUID = 1L;
    private Random rand = new Random();
    private int number = rand.nextInt(101);
    private JLabel result, prompt;
    private JTextField input;


    game() {
        super("Numbers");
        setSize(500, 500);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new FlowLayout());

        prompt = new JLabel("Enter a number between 1 and 100");
        add(prompt);

        input = new JTextField(3);
        add(input);

        result = new JLabel("");
        add(result);



        event a = new event();
        input.addActionListener(a);

    }

    public class event implements ActionListener {
        public void actionPerformed(ActionEvent a) {
            int guess = 0;

            try {
                guess = Integer.parseInt(input.getText());
            } catch(NumberFormatException e) {
                result.setText("Error - Illegal Data Entered");
                result.setForeground(Color.RED);
            }


            while(guess!=number) {
                if(guess>number) {
                    result.setText("Guess Too High. Try Again.");
                    result.setForeground(Color.CYAN);
                } else if(guess<number) {
                    result.setText("Guess Too Low. Try Again.");
                    result.setForeground(Color.CYAN);
                } else {
                    result.setText("Unknown Error");
                    result.setForeground(Color.RED);
                }
            }
            if(guess==number){
                result.setText("Right the number was "+number);
                result.setForeground(Color.GREEN);
            }
        }
    }

    public static void main(String[] args) {
        new game().setVisible(true);

    }

}

前もって感謝します。

アップデート

そのため、While ループを削除すると、すべてが正常に機能しました。それは正しくできましたか?

4

3 に答える 3

1

イベントディスパッチスレッドを、while-loop決して壊れることのないものでブロックしています...

while(guess!=number) {...}

更新しました...

それ以外の...

while(guess!=number) {
    if(guess>number) {
        result.setText("Guess Too High. Try Again.");
        result.setForeground(Color.CYAN);
    } else if(guess<number) {
        result.setText("Guess Too Low. Try Again.");
        result.setForeground(Color.CYAN);
    } else {
        result.setText("Unknown Error");
        result.setForeground(Color.RED);
    }
}

試す

if(guess>number) {
    result.setText("Guess Too High. Try Again.");
    result.setForeground(Color.CYAN);
} else if(guess<number) {
    result.setText("Guess Too Low. Try Again.");
    result.setForeground(Color.CYAN);
} else {
    result.setText("Unknown Error");
    result.setForeground(Color.RED);
}

Swing はイベント駆動型の環境です。つまり、ユーザーが何かを行い、プログラムがそれに応答するまで、プログラムは (自動的に) 待機します。

于 2013-06-05T02:27:38.923 に答える
1

あなたの問題はここにある、guessまたはnumber値を変更しない、無限ループ

 while(guess!=number) {
                    if(guess>number) {
                        result.setText("Guess Too High. Try Again.");
                        result.setForeground(Color.CYAN);
                    } else if(guess<number) {
                        result.setText("Guess Too Low. Try Again.");
                        result.setForeground(Color.CYAN);
                    } else {
                        result.setText("Unknown Error");
                        result.setForeground(Color.RED);
                    }
                }

while を削除するだけでよく、不要です

したがって、内部クラスは次のようになります

public class MyEvent implements ActionListener {
        public void actionPerformed(ActionEvent a) {
            int guess = 0;

            try {

               guess = Integer.parseInt(input.getText());
                        if(guess>number) {
                            result.setText("Guess Too High. Try Again.");
                            result.setForeground(Color.CYAN);
                        } else if(guess<number) {
                            result.setText("Guess Too Low. Try Again.");
                            result.setForeground(Color.CYAN);
                        } else {
                           result.setText("Right the number was "+number);
                           result.setForeground(Color.GREEN);                      
                        }

            }catch(NumberFormatException nfe){
                result.setText("Error - Illegal Data Entered");
                result.setForeground(Color.RED);               
            }

  }
}

その整数が失敗したときにすべてのブロックの原因をキャッチしようとします。イベントの実行を終了する必要があります..

注記規則に従い、宣言的な名前を付け、クラスは大文字で始める必要があります

于 2013-06-05T02:27:42.070 に答える