我刚开始学习Java GUI并在练习事件处理时遇到了这个问题。 Here's the initial window
当我在文本字段中输入一个数字时,应该说出猜测的数字是更高,更低还是匹配。如果不匹配,则会提示输入另一个号码。但窗口只是挂起。 After entering data
我猜它落在一个无限循环中。这是代码。 帮我弄清问题所在。感谢。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class RandomNumGame extends JFrame {
private JLabel promptLabel, resultLabel, answerLabel;
private int tries=1, randomNum, guessNum;
private JButton button;
private JTextField txt;
private boolean guessed;
public RandomNumGame() {
setLayout(new FlowLayout());
promptLabel = new JLabel("Guess a number(1-1000): ");
add(promptLabel);
txt = new JTextField(7);
add(txt);
button = new JButton("Guess!");
add(button);
resultLabel = new JLabel("");
add(resultLabel);
/*answerLabel = new JLabel("");
add(answerLabel);
*/
Event e = new Event();
button.addActionListener(e);
}
private class Event implements ActionListener{
public void actionPerformed(ActionEvent e){
randomNum = (int )(Math.random() * 1000 + 1);
guessed=false;
do{
try{
guessNum = (int)(Double.parseDouble(txt.getText()));
if(guessNum>randomNum){
resultLabel.setText("Your number is higher. Try Again");
}
else if(guessNum<randomNum){
resultLabel.setText("Your number is lower. Try Again");
}
else{
resultLabel.setText("Your number matched!");
guessed=true;
}
}
catch(Exception ee){
resultLabel.setText("Enter a legit number. What are you stupid?");
}
}while(!guessed);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
RandomNumGame ran = new RandomNumGame();
ran.setDefaultCloseOperation(EXIT_ON_CLOSE);
ran.setSize(300, 120);
//ran.pack();
ran.setVisible(true);
ran.setTitle("Random Number Game");
}
}
答案 0 :(得分:2)
GUI框架有自己的事件循环,当用户代码执行时,它的事件处理(包括响应文本输入,按下按钮等)将被阻止。您希望自己的事件处理程序尽快完成。
将其结构化为每次按下按钮时,将评估当前猜测,显示消息,并且处理程序结束。在按钮按下之间,程序保持猜测计数,数字等等。
答案 1 :(得分:2)
您的actionPerformed
方法中不需要循环。让它执行一次,并检查它是否在之后被猜到。当用户输入错误的数字时,您基本上只是陷入循环。为了使其更加流畅,只有在guessed
为true
时才创建随机数,只需执行猜测和条件一次。
// Change constructor
public RandomNumGame() {
...
guessed = true; // initialize to true to create a new number when you click
}
private class Event implements ActionListener{
public void actionPerformed(ActionEvent e){
if(guessed) { // If the number was guessed, on the next click you get a new random number
randomNum = (int )(Math.random() * 1000 + 1);
guessed = false;
}
try{
guessNum = (int)(Double.parseDouble(txt.getText()));
if(guessNum>randomNum){
resultLabel.setText("Your number is higher. Try Again");
}
else if(guessNum<randomNum){
resultLabel.setText("Your number is lower. Try Again");
}
else{
resultLabel.setText("Your number matched! Click again for a new Number");
guessed=true;
}
}
catch(Exception ee){
resultLabel.setText("Enter a legit number. What are you stupid?");
}
}
}
答案 2 :(得分:1)
您不应该阅读用户在循环中写入的内容。猜测按钮上的事件监听器应该检查数字是否更高或更低,然后停止。每次用户按下按钮时都会再次调用它。除了可能存在的其他问题之外,它现在的方式是它检查一次并保持循环检查永远直到它的权利。它不是一种实用和糟糕的编程,因为它会消耗很多cpu,就像那样活跃的等待。
答案 3 :(得分:1)
你是对的,这是循环问题。如果您输入的第一个号码与randomNum
不匹配,则变量guessed
将永远不会设置为true
。我建议你做以下事情:
randomNum
。在构造函数中执行。do{...} while(!guessed)
。你现在不需要循环,只需简单地拉出循环中的逻辑答案 4 :(得分:0)
您的随机数和文本输入将相同,直到循环。我假设该值不会落入guessed
变为真的其他条件。要么你需要在while循环中添加随机数生成语句。即。
do{
randomNum = (int )(Math.random() * 1000 + 1); //It required here
try{
guessNum = (int)(Double.parseDouble(txt.getText()));
if(guessNum>randomNum){
resultLabel.setText("Your number is higher. Try Again");
}
else if(guessNum<randomNum){
resultLabel.setText("Your number is lower. Try Again");
}
else{
resultLabel.setText("Your number matched!");
guessed=true;
}
}
catch(Exception ee){
resultLabel.setText("Enter a legit number. What are you stupid?");
}
}while(!guessed);