Java JFrame绘图两到三个项目,其中只有一个项目包含在我的Squares arraylist中

Java JFrame绘图两到三个项目,其中只有一个项目包含在我的Squares arraylist中,java,jframe,jlabel,rect,square,Java,Jframe,Jlabel,Rect,Square,标题。我创建了一个Square类,它定义了什么是正方形,并允许我创建一个带有特定参数的正方形。每当我向squares arraylist中添加一个正方形时,它最终会绘制两到三个。为什么会这样?我甚至让它将arraylist项目的数量(squares.size())打印到控制台中,它只显示一个。此外,每当我画正方形时,背景都会变成灰色。我怎样才能解决这个问题 编辑:它似乎还可以再次随机绘制正方形,或者至少在我移动窗口时在控制台中打印消息,但这并不总是发生 我的方形类(不包括getter+sette

标题。我创建了一个Square类,它定义了什么是正方形,并允许我创建一个带有特定参数的正方形。每当我向squares arraylist中添加一个正方形时,它最终会绘制两到三个。为什么会这样?我甚至让它将arraylist项目的数量(squares.size())打印到控制台中,它只显示一个。此外,每当我画正方形时,背景都会变成灰色。我怎样才能解决这个问题

编辑:它似乎还可以再次随机绘制正方形,或者至少在我移动窗口时在控制台中打印消息,但这并不总是发生

我的方形类(不包括getter+setter):

我的框架类:

public class Frame extends JFrame {

    public Frame() {
        super(Main.name);

        getContentPane().setBackground(Color.BLACK);

        setResizable(false);
        setSize(new Dimension(600, 600));
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

        MessageUtils.sendConsole("Frame setup.");
    }

    @Override
    public void paint(Graphics g) {
        int count = 1;
        for (Square s : Square.squares) {
            g.drawRect(s.getX(), s.getY(), s.getWidth(), s.getHeight());
            g.setColor(s.getColor());
            g.fillRect(s.getX(), s.getY(), s.getWidth(), s.getHeight());
            MessageUtils.sendConsole("Square #" + count + " drawn.");
            count++;
        }
    }
}

1) 不要覆盖JFrame的paint()。2) 而是重写JPanel的paintComponent(),第一条语句应该是super.paintComponent(),以确保清除背景。3) 然后将面板添加到框架中。阅读上的Swing教程以了解更多信息和工作示例。@camickr好的,但是如果我只在arraylist中放置一个正方形,为什么它会绘制多个正方形呢?随着时间的推移,为什么它会继续画更多的方块呢?背景没有被清除,还有垃圾在被画。你需要遵循正确的绘画指南,否则这就是可能发生的事情。
public class Main {
    public static String name = "Project";

    @SuppressWarnings("unused")
    public static void main(String args[]) {
        MessageUtils.sendConsole(name + " started.");

        Square.squares.add(new Square(50, 50, 150, 150, Color.black));

        Frame frame = new Frame();
    }
}
public class Frame extends JFrame {

    public Frame() {
        super(Main.name);

        getContentPane().setBackground(Color.BLACK);

        setResizable(false);
        setSize(new Dimension(600, 600));
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

        MessageUtils.sendConsole("Frame setup.");
    }

    @Override
    public void paint(Graphics g) {
        int count = 1;
        for (Square s : Square.squares) {
            g.drawRect(s.getX(), s.getY(), s.getWidth(), s.getHeight());
            g.setColor(s.getColor());
            g.fillRect(s.getX(), s.getY(), s.getWidth(), s.getHeight());
            MessageUtils.sendConsole("Square #" + count + " drawn.");
            count++;
        }
    }
}