【问题标题】:Why is paintComponent() getting called multiple times?为什么paintComponent() 会被多次调用?
【发布时间】:2020-04-18 11:33:44
【问题描述】:

我正在尝试编写一个实现观察者接口的类,该类根据来自 textField 的输入垂直绘制矩形。除了我的矩形不是从 coord(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();
    }

【问题讨论】:

    标签: java swing graphics


    【解决方案1】:

    Swing GUI 绘画永远不受您的直接控制。绘制完成可能是因为您的程序请求调用repaint(),即使这样也不能保证会导致绘制,或者因为操作系统认为窗口需要重新绘制并指示它这样做。正是出于这个原因,您应该避免将程序逻辑、状态更改代码(例如y = y + height;)放在绘画方法中。将它放在其他地方,比如在您的 update(...) 方法或 Swing Timer 中,然后让绘画方法只负责绘制程序状态的可视化表示,而不是更改它。

    更多详情,请阅读Painting in AWT and Swing

    【讨论】:

    • 感谢您的回答。我尝试将变量 y 添加到 update() 中。但是,我的矩形在更改后没有垂直堆叠。
    • @X_C95:那么你还有另一个问题,你的代码中有一个错误,但与你的主要问题无关,已经回答了
    猜你喜欢
    • 2011-11-21
    • 1970-01-01
    • 2022-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2016-02-04
    • 1970-01-01
    相关资源
    最近更新 更多