出于某种原因使用 .getText() 时重叠

Overlaping when using .setText() for some reason

我有一个名为 status 的 Jlabel 是空的。当我第一次执行 status.setText() 时它正常工作但是当我再次更改它时它与第一次更改重叠而不是像应该的那样替换它。这是怎么回事?

package panda.org;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.lang.Math;

public class NumberGame implements ActionListener{

    JFrame frame;
    JLabel rules;
    JLabel rulesText;
    JLabel rulesText2;
    JLabel lets;
    JButton play;
    JButton exit;
    JPanel panel;

    Font myFont = new Font("Serif Plain", Font.BOLD, 15);

    NumberGame() {

        frame = new JFrame("NumberGame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 500);
        frame.setLocationRelativeTo(null);
        frame.setLayout(null);
        frame.setResizable(true);
        Image icon = Toolkit.getDefaultToolkit().getImage("C:\Users\Gaming MSI\Pictures\Saved Pictures\download (1).png");
        frame.setIconImage(icon);

        rules = new JLabel("Rules: ");
        rules.setFont(myFont);
        rules.setBounds(50, 100, 100, 75);

        rulesText = new JLabel("We will pick a random number in the range of 1 -> 50.");
        rulesText.setBounds(100, 100, 315, 75);

        rulesText2 = new JLabel("Your job is to guess that number!");
        rulesText2.setBounds(100, 120, 315, 75);

        play = new JButton("Play");
        play.setBounds(150, 300, 100, 75);
        play.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                int failedAttempts = 0;

                JLabel label = new JLabel("Guess the number from 1 till 50");
                label.setFont(myFont);
                label.setBounds(150, 75, 315, 75);

                JLabel hints = new JLabel("");

                JTextField text = new JTextField();
                text.setBounds(250, 150, 100, 25);

                JButton check = new JButton("Check");
                check.setBounds(150, 150, 75, 25);

                double randomDouble = Math.random();
                randomDouble = randomDouble * 50 + 1;

                int randomInt = (int) randomDouble;

                double finalRandomDouble = randomDouble;
                check.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {

                        System.out.println(randomInt);
                        String nb = text.getText();

                        int change = Integer.parseInt(nb);

                        JLabel status = new JLabel("");
                        status.setBounds(150, 160, 1000, 100);

                        frame.add(status);

                        if(randomInt == change) {
                            status.setText("You chose the correct number!");
                            status.setForeground(Color.green);
                        }
                        if(randomInt != change) {
                            status.setText("Wrong choice! Try again.");
                            status.setForeground(Color.red);
                        }
                    }
                });

                rules.setText("");
                rulesText.setText("");
                rulesText2.setText("");

                frame.add(hints);
                frame.add(label);
                frame.add(check);
                frame.add(text);
            }
        });

        exit = new JButton("Exit");
        exit.setBounds(350, 300, 100, 75);
        exit.addActionListener(new ActionListener()  {
            public void actionPerformed(ActionEvent e) {

                int result = JOptionPane.showConfirmDialog(frame,"Are you sure want to exit?", "Exit",
                        JOptionPane.YES_NO_OPTION,
                        JOptionPane.QUESTION_MESSAGE);
                if(result == JOptionPane.YES_OPTION){
                    System.exit(0);
                }else if (result == JOptionPane.NO_OPTION){
                }else {
                }
            }
        });

        frame.add(play);
        frame.add(exit);
        frame.add(rules);
        frame.add(rulesText);
        frame.add(rulesText2);

        frame.setVisible(true);
    }

    public static void main(String[] args) {

        NumberGame number = new NumberGame();

    }

    @Override
    public void actionPerformed(ActionEvent e) {

    }
}

有人要求更多代码,所以这就是我的全部代码!我希望这会有所帮助 :D

问题出在这几行


                        if(randomInt == change) {
                            status.setText("You chose the correct number!");
                            status.setForeground(Color.green);
                        }
                        if(randomInt != change) {
                            status.setText("Wrong choice! Try again.");
                            status.setForeground(Color.red);
                        }
                    }

结果是这样的:

试试这个:

if(randomInt == change) {
    status.setText("You chose the correct number!");
    status.setForeground(Color.green);
}else{
    status.setText("Wrong choice! Try again.");
    status.setForeground(Color.red);
}

您的代码需要做一些改进:

  1. 您正在使用 null-layoutsetBounds(...),这是 not advised it will give you more headaches than solutions, it may seem like the best / easiest way to build complex GUIs but it's not, 's an example of why. Swing has to deal with multiple OS, PLAFs, screen sizes and resolutions, let the layout managers 为您完成的工作,您所要做的就是将它们结合起来。

  2. 每次调用 check.addActionListener(new ActionListener() { 时,您都会创建一个名为 statusJLabel 的新实例,因为您使用的是 null-layout 而你把它放在同一个位置,它们是重叠的。

遵循此答案中给出的第一个建议,使用布局管理器重建整个内容,将 status 标签移动为 class 成员,您应该不会有任何问题。