无法运行 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");
                }
            }
        }
    }
}

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

  1. 您的方法 actionPerformed 中不应有 while 循环,否则您的 swing 应用程序将冻结。
  2. 您不需要 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() 调用该方法。这允许您在退出之前清理应该完成的任何事情(比如提交或回滚任何数据库操作等)