2010-03-27 101 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