我正在Java Swing上做作业,而我正在制作一个GUI Guessing Game程序。我的问题是,当我按下“猜测”按钮没有任何反应时,我无法通过单击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");
}
}
}
}
}
答案 0 :(得分:3)
您的程序中有几个问题会导致您的问题:
while
不应该有actionPerformed
循环,否则您的摇摆应用程序将会冻结。Scanner
因为猜测是从文本字段中提取的值,因此guess = input.nextInt()
应为guess = Integer.parseInt(theText.getText())
。确实,否则您的申请将冻结,直到integer
中standard input stream
提供ImageReader
,这不是您所期望的。答案 1 :(得分:0)
始终将其添加到您的框架中非常有用:
frame.setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );
frame.addWindowListener( new WindowAdapter() {
@Override
public void windowClosing( final WindowEvent e ) {
handleExitRequest();
}
} );
然后创建一个方法handleExitRequest()来实际关闭(也许只是调用System.exit(0);) 您也可以从“退出”菜单项的actionPerformed()调用该方法,如果有的话。这允许您清理退出之前应该完成的任何事情(比如提交或回滚任何数据库操作等)。