2010-03-27 48 views
7

Tôi đang học các đường vẽ bằng Java Swing để vẽ một mê cung. Tôi có thể vẽ một dòng tại một vị trí được chỉ định và nó chỉ hiển thị tốt. Nhưng khi tôi muốn vẽ nhiều dòng, chỉ dòng cuối cùng mới hiển thị. Mã của tôi:Vẽ nhiều dòng với 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); 

} 

Tôi có thể phải làm mới thứ gì đó, để hiển thị tất cả các dòng được vẽ bằng vòng lặp, nhưng không biết gì.

Trả lời

10

Tại sao ví dụ của bạn không hoạt động là một ví dụ đơn giản; Swing sử dụng trình quản lý bố cục để đặt mọi thành phần được thêm vào Container lên màn hình. Bằng cách này, các dòng không chồng lên nhau.

Thay vào đó, hãy sử dụng một Component trong đó mỗi dòng được vẽ. Một giải pháp để vẽ mê cung sẽ là:

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); 
    } 
} 

Và sau đó sử dụng Labyrinth.addLine để thêm đường vào mê cung của bạn. Cũng thế; chỉ định chiều rộng và chiều cao cho Labyrinth, bằng cách gọi setBounds hoặc tương tự, vì Swing có thể cắt xén đồ họa.

+0

Tôi thấy điểm này, cảm ơn bạn rất nhiều vì câu trả lời của bạn! – rize

2

Vấn đề của bạn khá nhiều nắm này:

public class Line extends JPanel 

suy nghĩ của mỗi JPanel như một thẻ đục với một cái gì đó được vẽ trên nó. Bạn đang tạo ra một loạt những thứ này, mỗi dòng có một dòng được vẽ trên đó và sau đó xếp chồng lên nhau. Đó là lý do tại sao bạn chỉ có thể thấy dòng mới nhất.

Thay vào đó, bạn chỉ nên có một thành phần vẽ tất cả các đường của bạn theo phương pháp paintComponent.

+0

Cảm ơn bạn đã giải thích, tôi đã không thực sự chắc chắn những gì các thành phần khác nhau/phương pháp làm, kể từ khi tôi chỉ mới bắt đầu sử dụng swing, nhưng bây giờ tôi nhận được hang của nó :) – rize