【问题标题】:does calling a repaint() inside paint() lead to infinite recursion?在paint() 中调用repaint() 会导致无限递归吗?
【发布时间】:2014-01-10 19:17:36
【问题描述】:

我一直在开发一个与图形相关的 java 应用程序。据我了解,每次在代码中的任何位置使用 repaint() 方法时,都会调用被覆盖的paintComponent。但是我也在paintComponent本身内部使用了repaint()。为什么它不会导致无限递归?代码运行良好。

              panel = new JPanel(){
        public void paintComponent(Graphics g)
        {

            {

                panel.revalidate();
                panel.repaint();
                c.revalidate();
                c.repaint();
                revalidate();
                repaint();
                for(int i=0;i<linecount-1;i+=2)
                {
                    Line2D line = new Line2D.Double(xco[i],yco[i],xco[i+1],yco[i+1]);
                    Graphics2D g2d = (Graphics2D) g;
                    if(divide[i]==1)
                    {

                    //System.out.print(xco[i]+" "+yco[i]);
                    //System.out.println();

                     g2d.setStroke(drawingStroke);
                     g2d.draw(line);
                     g2d.setStroke(simple);
                    }
                    else
                    {
                        g2d.setStroke(simple);
                        g2d.draw(line);
                    }
                    //g.drawLine(xco[i],yco[i],xco[i+1],yco[i+1]);
                }

                //g.drawLine(x1,y1,x2,y2);
                panel.revalidate();
                panel.repaint();
                c.revalidate();
                c.repaint();
                revalidate();
                repaint();
            }
        }
    };

}

【问题讨论】:

  • Robin Green 是正确的:您不应该在paintComponent 中调用repaint(或revalidate)。 paintComponent 可能会被非常频繁地调用,并且需要轻量且快速。看来您无论如何都没有更改您的paintComponent 方法中的任何状态。 revalidate 调用(我很确定它会为你调用 repaint)应该立即跟随任何实际更改组件状态的代码。
  • 并不是你在想它,但它会很快吞噬你的系统资源,在一两分钟内让你的系统崩溃。

标签: java swing graphics


【解决方案1】:

它不会导致无限递归 - 在 Java 堆栈上 - 因为 repaint 只是安排新的绘制完成,它实际上并没有立即调用 paintpaintComponent

但是这样做仍然是个坏主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    相关资源
    最近更新 更多