【问题标题】:Drawing multiple lines with Java Swing使用 Java Swing 绘制多条线
【发布时间】:2010-03-27 23:39:47
【问题描述】:

我正在学习使用 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 循环绘制的所有线条,但不知道是什么。

【问题讨论】:

    标签: java swing


    【解决方案1】:

    为什么你的例子不起作用是一个简单的例子; 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 将线添加到您的迷宫中。还;通过调用setBounds 或类似方法为Labyrinth 指定宽度和高度,因为Swing 可能会裁剪图形。

    【讨论】:

      【解决方案2】:

      您的问题几乎可以归结为:

      public class Line extends JPanel
      

      将每个 JPanel 想象成一张不透明的卡片,上面画着一些东西。您正在创建一堆这些,每个都画有一条线,然后将它们堆叠在一起。这就是为什么您只能看到最近的一行。

      相反,您应该只有一个组件在其paintComponent 方法中绘制所有线条。

      【讨论】:

      • 感谢您的解释,我不太确定不同的组件/方法的作用,因为我刚开始使用 swing,但现在我已经掌握了窍门 :)
      猜你喜欢
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多