Рисование нескольких линий с помощью Java Swing - PullRequest
7 голосов
/ 28 марта 2010

Я изучаю рисование линий с помощью 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, но не знаю что.

Ответы [ 2 ]

10 голосов
/ 28 марта 2010

Почему ваш пример не работает, это просто; 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 может обрезать графику.

2 голосов
/ 28 марта 2010

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

public class Line extends JPanel

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...