无法让Java Swing GUI猜测游戏工作

时间:2016-05-18 13:44:50

标签: java swing button action

我正在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");
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:3)

您的程序中有几个问题会导致您的问题:

  1. 您的方法while不应该有actionPerformed循环,否则您的摇摆应用程序将会冻结。
  2. 您不需要Scanner因为猜测是从文本字段中提取的值,因此guess = input.nextInt()应为guess = Integer.parseInt(theText.getText())。确实,否则您的申请将冻结,直到integerstandard 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()调用该方法,如果有的话。这允许您清理退出之前应该完成的任何事情(比如提交或回滚任何数据库操作等)。