2010-03-27 2 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); 

} 

я, возможно, придется обновить что-то, чтобы отобразить все линии, нарисованные для цикла, но не знаю, что.

ответ

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

2

Ваша проблема в значительной степени сводится к следующему:

public class Line extends JPanel 

Think каждому JPanel как непрозрачная карта с чем-то нарисованным на нем. Вы создаете кучу из них, каждая из которых имеет одну линию, нарисованную на ней, а затем складывает их поверх друг друга. Вот почему вы можете видеть только самую последнюю строку.

Вместо этого у вас должен быть только один компонент, который рисует все ваши линии в своем методе paintComponent.

+0

Спасибо, что объяснил, я не был уверен, что делают разные компоненты/методы, так как я только начал использовать свинг, но теперь я получаю от этого зависание :) – rize

Смежные вопросы