无法运行 Java Swing GUI 猜谜游戏
Can't get Java Swing GUI Guessing Game to work
我正在做一个关于 Java Swing 的作业,我正在制作一个 GUI 猜谜游戏程序。我的问题是当我按下 "guess" 按钮时没有任何反应,我无法通过单击 X 关闭它我必须用 Eclipse 终止它。我做错了什么?
GuessHandler 是否正确实现了 ActionListener 还是我在那里做错了什么?
public class GuessingGameGui extends JFrame
{
public static final int WIDTH = 600;
public static final int HEIGHT = 400;
private JTextField theText;
private JLabel message;
private JPanel p1;
private JPanel p2;
private int guess;
private int numberOfTries = 0;
public GuessingGameGui()
{
super();
setSize(WIDTH, HEIGHT);
//set the window title to "Guessing Game"
setTitle("Guessing Game");
Container c = getContentPane();
c.setLayout(new BorderLayout( ));
c.setBackground(Color.WHITE);
p1 = new JPanel();
p2 = new JPanel();
p1.setBackground(Color.WHITE);
p2.setBackground(Color.BLUE);
//"add a JButton called "Guess"
JButton guessButton = new JButton("Guess");
GuessHandler ghandler = new GuessHandler();
guessButton.addActionListener(ghandler);
p1.add(guessButton);
//The north panel will have a JLabel with the text "Guess a number between 1 and 10?"
JLabel label1 = new JLabel("Guess a number between 1 and 10?");
c.add(label1, BorderLayout.NORTH);
//The south panel will have a JLabel for displaying if the user guessed correctly or not
message = new JLabel("");
p2.add(message, BorderLayout.SOUTH);
c.add(p2, BorderLayout.SOUTH);
JPanel textPanel = new JPanel( );
textPanel.setBackground(Color.LIGHT_GRAY);
//In the center panel, add a JTextField where the user can enter a number to guess
theText = new JTextField(10);
theText.setBackground(Color.WHITE);
textPanel.add(theText);
textPanel.add(p1);
c.add(textPanel, BorderLayout.CENTER);
}
public static void main(String[] args)
{
GuessingGameGui guessGame = new GuessingGameGui();
guessGame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
guessGame.setSize(WIDTH, HEIGHT);
guessGame.setVisible(true);
}
class GuessHandler implements ActionListener {
@Override
public void actionPerformed( ActionEvent e )
{
int numberToGuess = (int) (Math.random() * 10 + 1);
Scanner input = new Scanner (System.in);
boolean win = false;
while (win == false){
guess = input.nextInt();
numberOfTries++;
if (guess < 1 || guess > 10)
{
//Make the south panel background color RED if they entered an invalid number (not between 1 and 10)
p2.setBackground(Color.RED);
}
else if (guess == numberToGuess)
{
win = true;
//Make the south panel background color YELLOW if they guessed right
p2.setBackground(Color.YELLOW);
//and display "YOU GOT IT (n attempts)", where n is the number of attempts the user guessed
message.setText("YOU GOT IT (" +numberOfTries + "attempts)");
}
else
{
//Make the south panel background color GREY if they guessed wrong
p2.setBackground(Color.GRAY);
//display "Sorry try again"
message.setText("Sorry try again");
}
}
}
}
}
您的程序中有几个问题导致了您的问题:
- 您的方法
actionPerformed
中不应有 while
循环,否则您的 swing 应用程序将冻结。
- 您不需要
Scanner
,因为猜测是从您的文本字段中提取的值,因此 guess = input.nextInt()
应该是 guess = Integer.parseInt(theText.getText())
。事实上,否则您的应用程序将冻结,直到 standard input stream
中提供 integer
,这不是您在这里期望的。
始终将此添加到您的框架中会很有用:
frame.setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );
frame.addWindowListener( new WindowAdapter() {
@Override
public void windowClosing( final WindowEvent e ) {
handleExitRequest();
}
} );
然后创建一个方法 handleExitRequest() 来完成实际的关闭(也许只是调用 System.exit(0);)
如果有的话,您还可以从 "Exit" 菜单项的 actionPerformed() 调用该方法。这允许您在退出之前清理应该完成的任何事情(比如提交或回滚任何数据库操作等)
我正在做一个关于 Java Swing 的作业,我正在制作一个 GUI 猜谜游戏程序。我的问题是当我按下 "guess" 按钮时没有任何反应,我无法通过单击 X 关闭它我必须用 Eclipse 终止它。我做错了什么? GuessHandler 是否正确实现了 ActionListener 还是我在那里做错了什么?
public class GuessingGameGui extends JFrame
{
public static final int WIDTH = 600;
public static final int HEIGHT = 400;
private JTextField theText;
private JLabel message;
private JPanel p1;
private JPanel p2;
private int guess;
private int numberOfTries = 0;
public GuessingGameGui()
{
super();
setSize(WIDTH, HEIGHT);
//set the window title to "Guessing Game"
setTitle("Guessing Game");
Container c = getContentPane();
c.setLayout(new BorderLayout( ));
c.setBackground(Color.WHITE);
p1 = new JPanel();
p2 = new JPanel();
p1.setBackground(Color.WHITE);
p2.setBackground(Color.BLUE);
//"add a JButton called "Guess"
JButton guessButton = new JButton("Guess");
GuessHandler ghandler = new GuessHandler();
guessButton.addActionListener(ghandler);
p1.add(guessButton);
//The north panel will have a JLabel with the text "Guess a number between 1 and 10?"
JLabel label1 = new JLabel("Guess a number between 1 and 10?");
c.add(label1, BorderLayout.NORTH);
//The south panel will have a JLabel for displaying if the user guessed correctly or not
message = new JLabel("");
p2.add(message, BorderLayout.SOUTH);
c.add(p2, BorderLayout.SOUTH);
JPanel textPanel = new JPanel( );
textPanel.setBackground(Color.LIGHT_GRAY);
//In the center panel, add a JTextField where the user can enter a number to guess
theText = new JTextField(10);
theText.setBackground(Color.WHITE);
textPanel.add(theText);
textPanel.add(p1);
c.add(textPanel, BorderLayout.CENTER);
}
public static void main(String[] args)
{
GuessingGameGui guessGame = new GuessingGameGui();
guessGame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
guessGame.setSize(WIDTH, HEIGHT);
guessGame.setVisible(true);
}
class GuessHandler implements ActionListener {
@Override
public void actionPerformed( ActionEvent e )
{
int numberToGuess = (int) (Math.random() * 10 + 1);
Scanner input = new Scanner (System.in);
boolean win = false;
while (win == false){
guess = input.nextInt();
numberOfTries++;
if (guess < 1 || guess > 10)
{
//Make the south panel background color RED if they entered an invalid number (not between 1 and 10)
p2.setBackground(Color.RED);
}
else if (guess == numberToGuess)
{
win = true;
//Make the south panel background color YELLOW if they guessed right
p2.setBackground(Color.YELLOW);
//and display "YOU GOT IT (n attempts)", where n is the number of attempts the user guessed
message.setText("YOU GOT IT (" +numberOfTries + "attempts)");
}
else
{
//Make the south panel background color GREY if they guessed wrong
p2.setBackground(Color.GRAY);
//display "Sorry try again"
message.setText("Sorry try again");
}
}
}
}
}
您的程序中有几个问题导致了您的问题:
- 您的方法
actionPerformed
中不应有while
循环,否则您的 swing 应用程序将冻结。 - 您不需要
Scanner
,因为猜测是从您的文本字段中提取的值,因此guess = input.nextInt()
应该是guess = Integer.parseInt(theText.getText())
。事实上,否则您的应用程序将冻结,直到standard input stream
中提供integer
,这不是您在这里期望的。
始终将此添加到您的框架中会很有用:
frame.setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );
frame.addWindowListener( new WindowAdapter() {
@Override
public void windowClosing( final WindowEvent e ) {
handleExitRequest();
}
} );
然后创建一个方法 handleExitRequest() 来完成实际的关闭(也许只是调用 System.exit(0);) 如果有的话,您还可以从 "Exit" 菜单项的 actionPerformed() 调用该方法。这允许您在退出之前清理应该完成的任何事情(比如提交或回滚任何数据库操作等)