2010-03-27 17 views
7

Estoy aprendiendo a dibujar líneas con Java Swing para dibujar un laberinto. Puedo dibujar una línea en una posición específica y se muestra bien. Pero cuando quiero dibujar varias líneas, solo se muestra la última. Mi código:Dibujar varias líneas con 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); 

} 

que probablemente tenga que actualizar algo, para mostrar todas las líneas dibujadas con for-loop, pero no sé qué.

Respuesta

10

Por qué su ejemplo no funciona es simple; Swing usa un administrador de diseño para colocar cada componente agregado a un Container en la pantalla. De esta manera, las líneas no se superponen.

En su lugar, utilice un Component en el que se dibuja cada línea. Una solución para la elaboración de un laberinto sería:

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

y luego usar Labyrinth.addLine para agregar líneas a su laberinto. También; especifique un ancho y alto para su Labyrinth, llamando al setBounds o similar, porque Swing puede estar recortando los gráficos.

+0

Veo el punto ahora, ¡muchas gracias por su respuesta! – rize

2

Su problema más o menos se reduce a esto:

public class Line extends JPanel 

Piense en cada JPanel como una tarjeta opaca con algo dibujado en él. Está creando un montón de estos, cada uno con una sola línea dibujada en él, y luego apilándolos uno encima del otro. Es por eso que solo puedes ver la línea más reciente.

En su lugar, debe tener solo un componente que dibuje todas sus líneas en su método paintComponent.

+0

Gracias por explicar, no estaba muy seguro de lo que hacen los distintos componentes/métodos, ya que recién comencé a usar swing, pero ahora me estoy acostumbrando :) – rize