2014-10-19 86 views
0

让我的代码工作时遇到了一些麻烦。在我的代码中,嵌套的等腰三角形假设是这样绘制的:enter image description here
我不确定我的代码是否可以工作,因为一旦我运行它,三角形就不会绘制。我给出的这个错误线程嵌套右等腰三角形Java

例外 “AWT-EventQueue的 - 0” java.lang.StackOverflowError的

,我不知道如何解决它。帮帮我?

import java.awt.*; 
import javax.swing.*; 

public class Ornament extends JPanel 
{ 
public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); // Call JPanel's paintComponent method 
           // to paint the background 
    drawTriangles(g, 100, 80, 64); 
} 


/** 
* Draws an ornament made of triangles in Graphics g with the base midpoint 
* at (x, y) and base half-length r 
*/ 
public void drawTriangles(Graphics g, int x, int y, int r) 
{ 
    g.drawLine(x + r, y, x - r, y); 
    g.drawLine(x + r, y, x, y - r); 
    g.drawLine(x - r, y, x, y - r); 

    if (r == 4) 
    { 
     drawTriangles(g, x-r , y, r); 
     drawTriangles(g, x-r , y, r); 
    } 

    else { 

     drawTriangles(g, 36+r , y, r); 
     r --; 
    } 

} 


public static void main(String[] args) 
{ 
    JFrame w = new JFrame("Triangles"); 
    w.setBounds(300, 300, 200, 120); 
    w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    Ornament panel = new Ornament(); 
    panel.setBackground(Color.WHITE); 
    Container c = w.getContentPane(); 
    c.add(panel); 
    w.setResizable(false); 
    w.setVisible(true); 
} 
} 
+1

您的'drawTriangles'没有基本大小写。 – BitNinja 2014-10-19 23:01:51

回答

1

如果调用drawTrianglesr不等于4,它会保持与同r连连自称。 r--永远不会到达。

尝试在else子句中递归调用之前放r--

+1

这对于'r = 4'的情况也没有帮助,它也被破坏了。 – 2014-10-19 23:13:33

0

您正在创建一个无限循环。 这是在第一个系列迭代发生:

drawTriangles(g, 100, 80, 64); 
    // draw lines 
    drawTriangles(g, 136 , 80, 64); 
    // draw lines 
    drawTriangles(g, 172 , 80, 64); 
     // draw lines 
     drawTriangles(g, 208, 80, 64); 
     r--; 
    r --; 
    r--; 

等等。然而,从未到达r--因为你首先进入下一级递归。 如果你换成drawTriangles和r--,至少r会变小,尽管不是很快。我会期待r/2或其他什么。

1

你不想继续,一旦你达到4(你的基本情况),所以你可以写的if语句

if (r != 4) { 
    drawTriangles(g, 36 + r , y, r - 1); 
} 

这不会产生图形输出如图所示的原始描述,但将阻止0123'