2010-03-27 89 views
7

我正在学习用Java Swing绘制线条以绘制迷宫。我可以在指定的位置画一条线,显示得很好。但是当我想绘制多行时,只显示最后一行。我的代码:用Java Swing绘制多行

public class LabyrinthGUI extends JFrame { 
... 
Line line; 
for (int i = 0; i < 10; i++) { 
    line = new Line(i*25, 0, (i+1)*25, 50); 
    this.getContentPane().add(line); 
} 
} 

public class Line extends JPanel{ 
private int x1, y1, x2, y2; 

public Line(int x1, int y1, int x2, int y2) { 
    this.x1 = x1; 
    this.y1 = y1; 
    this.x2 = x2; 
    this.y2 = y2; 
} 
public void paintComponent (Graphics g) { 
    g.drawLine(x1, y1, x2, y2); 

} 

我可能不得不刷新一些东西,显示所有使用for-loop绘制的线条,但不知道是什么。

回答

10

为什么你的例子不起作用是一个简单的例子; Swing使用布局管理器将添加到Container的每个组件放到屏幕上。这样,这些线不重叠。

取而代之,使用其中每一条线都绘制的一个Component。一种用于绘制一个迷宫的解决办法是:

public class Labyrinth extends JPanel { 

    private final ArrayList<Line> lines = new ArrayList<Line>(); 

    public void addLine(int x1, int y1, int x2, int y2) { 
     this.lines.add(new Line(x1, y1, x2, y2)); 
    } 

    public void paintComponent(Graphics g) { 
     for(final Line r : lines) { 
      r.paint(g); 
     } 
    } 
} 

public static class Line { 
    public final int x1; 
    public final int x2; 
    public final int y1; 
    public final int y2; 
    public Line(int x1, int y1, int x2, int y2) { 
     this.x1 = x1; 
     this.x2 = x2; 
     this.y1 = y1; 
     this.y2 = y2; 
    } 
    public void paint(Graphics g) { 
     g.drawLine(this.x1, this.y1, this.x2, this.y2); 
    } 
} 

然后用Labyrinth.addLine到行添加到您的迷宫。也;指定Labyrinth的宽度和高度,通过调用setBounds或类似的方法,因为Swing可能会裁剪图形。

+0

我现在明白了这一点,非常感谢您的回答! – rize 2010-03-27 23:57:24

2

你的问题相当多归结为:

public class Line extends JPanel 

想想每个JPanel中为不透明卡上绘制的东西。你正在创建一组这样的东西,每个都绘制一条线,然后将它们堆叠在一起。这就是为什么你只能看到最近的一行。

相反,您应该只有一个组件在其paintComponent方法中绘制所有行。

+0

感谢您的解释,我不确定不同的组件/方法是什么,因为我刚开始使用swing,但现在我得到了它的窍门:) – rize 2010-03-28 00:01:21