首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Graphics2D.drawPolyline()与Graphics2D.drawLine()

Graphics2D.drawPolyline()与Graphics2D.drawLine()
EN

Stack Overflow用户
提问于 2016-06-22 00:32:49
回答 2查看 3.1K关注 0票数 2

调用drawPolyline()相对于遍历每一行并在Graphics2D类中调用drawLine()有什么好处吗?

例如:

graphics2d.drawPolyline(xPoints, yPoints, nPoints);

相对于:

代码语言:javascript
复制
for (MyBean line : myBeans) {
    graphics2d.drawLine(line.getX1Point(), line.getY1Point(), line.getX2Point(), line.getY2Point());     
}

第一种是第二种方便的方法吗?

对AWT来说挺新鲜的。(我意识到第一个可能更简洁。)

编辑:,我调用BufferedImage.createGraphics()来实现Graphics2D

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-22 14:00:26

的一个重要区别:使用drawPolyline,您正在绘制一条单一的折线。使用drawLine,您正在绘制单独的线条。到目前为止很明显。但这意味着什么呢?

这种区别主要表现在将一个“非平凡”的Stroke分配给图形对象时-通常是一个特定的BasicStroke。这将在构造函数中接收多个参数。关于您的问题,最重要的是join参数。它可以是JOIN_BEVELJOIN_METERJOIN_ROUND。它决定了两个连接的线是如何连接的。显然,只有当已知线路是连接的时才能应用这一点,这只是drawPolyline调用中的情况。它根本不能应用于单个drawLine调用。

下面是显示这种差异的屏幕截图。它使用智慧为15的中风和join=BasicStroke.JOIN_ROUND。左边的部分用drawPolyline绘制,右边的部分画成单独的线条:

但是你通常不应该使用drawPolyline .

..。因为它已经过时了,而且有几个缺点。首先,创建调用它所需的数组是一个麻烦。更重要的是,它只接受int[]数组。

整个Java2D绘图基础结构最初集中在int坐标上,就像在Graphics#drawLine(int,int,int,int)中一样。这已经被推广了,Graphics2D方法在这里允许了更大的灵活性。因此,现在绘制折线的通常方法是创建一个包含polyline的Shape对象。在大多数情况下,这将是一个Path2D实例:

代码语言:javascript
复制
Path2D path = new Path2D.Double();
path.moveTo(x0,y0);
path.lineTo(x1,y1);
path.lineTo(x2,y2);
...
graphics2D.draw(path);

不过,仅供参考,下面是用于创建上述映像的代码:

代码语言:javascript
复制
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class DrawLineVsDrawPolyline
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
   
    private static void createAndShowGUI()
    {
        JFrame f = new JFrame("");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().setLayout(new BorderLayout());
       
        class Line
        {
            int x1, y1, x2, y2;
            Line(int x1, int y1, int x2, int y2)
            {
                this.x1 = x1;
                this.y1 = y1;
                this.x2 = x2;
                this.y2 = y2;
            }
            public int getX1Point()
            {
                return x1;
            }
            public int getY1Point()
            {
                return y1;
            }
            public int getX2Point()
            {
                return x2;
            }
            public int getY2Point()
            {
                return y2;
            }
        }
        int xPoints[] = new int[] { 100, 150, 200 };
        int yPoints[] = new int[] { 100, 250, 100 };
        int nPoints = xPoints.length;
        List<Line> lines = new ArrayList<Line>();
        for (int i0=0; i0<nPoints-1; i0++)
        {
            int i1 = i0+1;
            int x1 = xPoints[i0];
            int y1 = yPoints[i0];
            int x2 = xPoints[i1];
            int y2 = yPoints[i1];
            lines.add(new Line(x1,y1,x2,y2));
        }
        
        JPanel panel = new JPanel()
        {
            @Override
            protected void paintComponent(Graphics gr) 
            {
                super.paintComponent(gr);
                Graphics2D g = (Graphics2D)gr;
                
                g.setColor(Color.RED);
                g.setStroke(new BasicStroke(20.0f, 
                    BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND));

                g.drawPolyline(xPoints, yPoints, nPoints);
                
                g.translate(200, 0);
                
                for (Line line : lines) {
                    g.drawLine(
                        line.getX1Point(), line.getY1Point(), 
                        line.getX2Point(), line.getY2Point());     
                }
                
            }
        };
        f.getContentPane().add(panel, BorderLayout.CENTER);
        
        f.setSize(500,500);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
    
}
票数 5
EN

Stack Overflow用户

发布于 2016-06-22 06:30:28

请记住,Graphics2D是一个抽象类,因此您不知道正在使用的是哪个具体实现,因此我将使用使代码更简洁的任何方法。

我很少使用drawPolyline(),因为将坐标输入数组以传递给方法通常很麻烦。但是您还应该考虑创建一个GeneralPath对象,该对象可以传递给Graphics2D.draw(Shape)方法。绘制路径可能比为某些Graphics2D实现绘制单独的行更有效。偶尔我也会注意到,使用路径(而不是单独的行)输出的效果会稍微好一些,特别是如果线条颜色是部分透明的(有时可以看到更暗的点,其中各个行的端点重叠)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37956734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档