2010-03-27 20 views
7

Ich lerne Zeichenlinien mit Java Swing, um ein Labyrinth zu zeichnen. Ich kann eine Linie an einer bestimmten Position zeichnen, und es zeigt sich gut. Aber wenn ich mehrere Zeilen zeichnen möchte, wird nur die letzte angezeigt. Mein Code:Mehrere Zeilen mit Java Swing zeichnen

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

} 

Ich habe wohl etwas zu erfrischen, alle Linien mit for-Schleife gezogen angezeigt werden, aber nicht wissen, was.

Antwort

10

Warum Ihr Beispiel nicht funktioniert, ist ein einfaches; Swing verwendet einen Layout-Manager, um alle Komponenten, die zu einem Container hinzugefügt wurden, auf dem Bildschirm anzuzeigen. Auf diese Weise überschneiden sich die Linien nicht.

Verwenden Sie stattdessen eine Component, in der jede Zeile gezeichnet wird. Eine Lösung für ein Labyrinth zeichnen wäre:

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

Und dann Labyrinth.addLine verwenden Zeilen zu Ihrem Labyrinth hinzuzufügen. Ebenfalls; Spezifizieren Sie eine Breite und Höhe für Ihre Labyrinth, indem Sie setBounds oder ähnliches aufrufen, da Swing die Grafiken beschneiden kann.

+0

Ich sehe den Punkt jetzt, vielen Dank für Ihre Antwort! – rize

2

Ihr Problem so ziemlich läuft darauf hinaus, diese nach unten:

public class Line extends JPanel 

Denken Sie an jeder JPanel als opake Karte mit etwas darauf gezeichnet. Sie erstellen eine Reihe von diesen, jede mit einer einzelnen Linie gezeichnet, und dann übereinander gestapelt. Deshalb können Sie nur die letzte Zeile sehen.

Stattdessen sollten Sie nur eine Komponente haben, die alle Ihre Linien in seiner paintComponent Methode zeichnet.

+0

Danke für die Erklärung, ich war nicht wirklich sicher, was die verschiedenen Komponenten/Methoden tun, da ich gerade Swing benutze, aber jetzt bekomme ich den Dreh raus :) – rize