Java 在paint()内部调用repaint()是否会导致无限递归?

Java 在paint()内部调用repaint()是否会导致无限递归?,java,swing,graphics,Java,Swing,Graphics,我一直在开发一个与图形相关的java应用程序。根据我的理解,每次我在代码中的任何地方使用repaint()方法时,都会调用被重写的paintComponent。但是我也在paintComponent内部使用了repaint(),为什么它不会导致无限递归呢?代码运行良好 panel = new JPanel(){ public void paintComponent(Graphics g) { {

我一直在开发一个与图形相关的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();
            }
        }
    };
panel=newjpanel(){
公共组件(图形g)
{
{
panel.revalidate();
panel.repaint();
c、 重新验证();
c、 重新油漆();
重新验证();
重新油漆();

对于(int i=0;i,它不会导致Java堆栈上的无限递归,因为重新绘制只是安排要完成的新绘制,它实际上不会立即调用
paint
paintComponent


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

Robin Green是正确的:您不应该从paintComponent内调用repaint(或重新验证)。paintComponent可能会被频繁调用,并且需要轻量级和快速。看起来您仍然没有更改paintComponent方法中的任何状态。重新验证调用(我很确定这将为您调用repaint)应该立即遵循任何实际更改组件状态的代码。这并不是说您正在考虑它,而是它将非常快速地消耗您的系统资源,在一两分钟内使您的系统崩溃。