为计数器不工作更新jlabel文本输出

wmomyfyw  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(358)

所以我在做一个猜数字的游戏。计算机生成一个随机数,用户输入一个猜测,然后计算机让用户知道他们是否赢了,或者猜测是否小于或大于随机数。这将一直持续到他们得到它的权利,或再次按下播放(重置)。
我想计算并显示用户每轮的猜测次数。所以每次猜测我都会增加“tallyvalue”。我知道这是正确的计算和增加值。但是,例如,如果用户在一行中猜测两次小于随机数的值,那么tally值不会在.settext输出上更新。它只会在用户从小于随机数到大于随机数的交替猜测中更新。
我错过了什么?我试着删除然后设置文本,但我不明白为什么会发生这种情况。

MyFrame() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //exit out of app 
        this.setLayout(new FlowLayout());

        //add labels, buttons and input fields
        button = new JButton("Submit");
        button.addActionListener(this); //can just pass in this because we already pass actionlistener above

        JLabel instruction = new JLabel();
        instruction.setText("Input Your Guess (must be between 1 and 100");

        textField = new JTextField();
        textField.setPreferredSize(new Dimension(250,40));

        tally = new JLabel();
        tally.setText("Number of guesses: " + tallyValue);

        outputMessage = new JLabel();
        outputMessage.setText("Take a guess!");

        playAgainButton = new JButton("Play Again");
        playAgainButton.addActionListener(this);

        this.add(instruction);
        this.add(textField);
        this.add(button);
        this.add(playAgainButton);
        this.add(outputMessage);
        this.add(tally);
        this.setTitle("Number Guessing Game");
        this.setVisible(true); //make frame visible
        this.pack(); //frame size adjusts to components

        ImageIcon icon = new ImageIcon("res/game-icon.png"); //creates an image icon
        this.setIconImage(icon.getImage());//changes icon of frame

        System.out.println(randomNumber); //for testing purposes
    }

    //add any unimplemented methods because we are using an interface
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==button) {
            int textFieldValue;

            this.remove(outputMessage);
            try {
                textFieldValue = Integer.parseInt(textField.getText());
                //if guess is correct
                if(textFieldValue == randomNumber) {
                    outputMessage.setText("Congratulations you guessed correctly!");
                    this.add(outputMessage);

                    tallyValue++;

                    displayCount(tallyValue);

                    this.pack();
                    textFieldValue = 0; //reset text field val

                }
                //if guess is less than randomNumber
                if(textFieldValue < randomNumber) {
                    outputMessage.setText("Incorrect - the number I am thinking of is more than that");
                    this.add(outputMessage);

                    tallyValue++;

                    displayCount(tallyValue);

                    this.pack();
                    textFieldValue = 0; //reset text field val

                }
                //if guess is more than randomNumber
                if(textFieldValue > randomNumber) {
                    outputMessage.setText("Incorrect - the number I am thinking of is less than that");
                    this.add(outputMessage);

                    tallyValue++;
                    System.out.println(tallyValue);
                    displayCount(tallyValue);

                    this.pack();
                    textFieldValue = 0; //reset text field val

                }
             }
            catch (NumberFormatException ex){
                outputMessage.setText("You must insert a valid number");
                this.add(outputMessage);
                this.pack();
            }
        }

        if(e.getSource()==playAgainButton) {
            System.out.println("pa");
            this.remove(outputMessage);
            randomNumber = rand.nextInt(101);
            outputMessage.setText("Take a guess!");
            this.add(outputMessage);

            tallyValue = 0;
            displayCount(tallyValue);

            this.pack();
        }
    }

    private void displayCount (int tv) {
        this.remove(tally);
        tally.setText("Number of guesses:" + tv);
        this.add(tally);
        this.pack();
    }
qyyhg6bp

qyyhg6bp1#

它只会在用户从小于随机数到大于随机数的交替猜测中更新。
不需要在3个不同的地方增加计数。计数应该在integer.parseint(…)语句之后立即递增。也就是说,无论猜测是什么,每次猜测都会更新。
然后用新计数更新计数标签的文本。无需从框架中移除/添加标签。无需 Package 框架。仅设置文本将导致标签重新绘制。因此不需要displaycount()方法。
您还应该学习如何正确使用布局管理器。当前使用的flowlayout只会导致组件显示在一行中,然后换行到下一行。这不是一个非常有效的布局,因为如果调整框架的大小,所有组件都会移动。
阅读有关布局管理器的swing教程。可以使用不同的布局管理器嵌套面板,以实现更灵活的布局。

textField = new JTextField();
    textField.setPreferredSize(new Dimension(250,40));

不要用幻数来表示组件的大小。相反,请正确使用api,以便文本字段可以确定自己的首选大小:

textField = new JTextField(10);

“10”将允许文本字段在滚动文本前显示10个“w”字符。
此外,您不应该对按钮使用共享的actionlistener。
一种方法是使用lamba来分离功能:

//playAgainButton.addActionListener(this);
playAgainButton.addActionListener((e) -> playAgain());

然后创建一个私有方法 playAgain() 在你们班上。现在代码按函数分为多个方法。

相关问题