Java 为什么paintComponent()会被多次调用?

Java 为什么paintComponent()会被多次调用?,java,swing,graphics,Java,Swing,Graphics,我正试图编写一个实现observer接口的类,这个类根据textField的输入垂直绘制矩形。除了我的矩形不是从坐标(0,0)开始外,所有的东西都正常运行。我试着放一个System.out.print,看看发生了什么,我的paintComponent()似乎被调用了两次。我不知道到底哪里出了问题。谁能帮我解决这个问题?下面是我的代码: public void paintComponent(Graphics g) { super.paintComponent(g);

我正试图编写一个实现observer接口的类,这个类根据textField的输入垂直绘制矩形。除了我的矩形不是从坐标(0,0)开始外,所有的东西都正常运行。我试着放一个System.out.print,看看发生了什么,我的paintComponent()似乎被调用了两次。我不知道到底哪里出了问题。谁能帮我解决这个问题?下面是我的代码:

public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        for (int i = 0; i < dm.getData().size(); i++)
        {
            Rectangle2D rectangle = new Rectangle2D.Double(x, y, dm.getDataElement(i), height);
            g2.draw(rectangle);
            System.out.println(i + "th rec drew.");
            y = y + height;
        }
    }

public void update(Observable o, Object arg) {
        // TODO Auto-generated method stub
        repaint();
    }
公共组件(图形g)
{
超级组件(g);
图形2d g2=(图形2d)g;
对于(int i=0;i
Swing GUI绘制永远不在您的直接控制之下。绘制可能是因为您的程序通过调用
repaint()
请求完成,即使这样也不能保证会导致绘制,或者是因为操作系统认为窗口需要重新绘制并指示它这样做。正是出于这个原因,您应该避免放入程序逻辑、状态更改代码,例如
y=y+height,在绘制方法中。把它放在别处,比如说在你的
update(…)
方法或Swing定时器中,然后让绘画方法只负责绘制程序状态的可视表示,而不是更改它


有关这方面的更多详细信息,请阅读

谢谢您的回答。我试着在变量y相加时将其放入update()中。但是,在我更改矩形后,它并没有垂直堆叠。@X_C95:然后您遇到了另一个问题,代码中有一个bug,但与您的主要问题无关,这个问题已经得到了回答