Graphics2D.drawPolyline() 与 Graphics2D.drawLine()

vph*_*nyc 2 java awt graphics2d

drawPolyline()与遍历每一行并drawLine()在类中调用相比,调用有什么好处吗Graphics2D

例如:

graphics2d.drawPolyline(xPoints, yPoints, nPoints);

相对:

for (MyBean line : myBeans) {
    graphics2d.drawLine(line.getX1Point(), line.getY1Point(), line.getX2Point(), line.getY2Point());     
}
Run Code Online (Sandbox Code Playgroud)

第一个方法是第二个方法的便捷方法吗?

对 AWT 来说还很陌生。(我意识到第一个可能更简洁。)

编辑:我呼吁BufferedImage.createGraphics()实施Graphics2D.

Mar*_*o13 5

一个重要的区别:drawPolyline您正在绘制一条多段线。你drawLine正在绘制单独的线条。到目前为止,一切都很明显。但是这是什么意思?

Stroke差异主要在为图形对象分配“重要”时出现- 通常是某个BasicStroke. 这在构造函数中接收几个参数。关于你的问题,最重要的是join参数。它可以是JOIN_BEVELJOIN_METERJOIN_ROUND。它决定两条 连接线的连接方式。显然,这只能在已知线路已连接的情况下应用,而这仅是呼叫中的情况drawPolyline。它根本不能应用于个人drawLine呼叫。

下面的屏幕截图显示了这种差异。它使用宽度为 15 且join=BasicStroke.JOIN_ROUND. 左侧部分用 绘制drawPolyline,右侧部分绘制为单独的线:

绘制线与绘制多段线01

但无论如何你通常不应该使用drawPolyline......

...因为它在某种程度上已经过时并且有一些缺点。首先,创建调用它所需的数组很麻烦。重要的是,它只接受int[]数组。

整个 Java 2D 绘画基础设施最初关注的是int坐标,就像Graphics#drawLine(int,int,int,int). 这已经被概括,并且这些Graphics2D方法在这里允许更大的灵活性。因此,现在绘制折线的常用方法是创建一个Shape包含折线的对象。在大多数情况下,这将是一个Path2D实例:

Path2D path = new Path2D.Double();
path.moveTo(x0,y0);
path.lineTo(x1,y1);
path.lineTo(x2,y2);
...
graphics2D.draw(path);
Run Code Online (Sandbox Code Playgroud)

不过,仅供参考,以下是用于创建上图的代码:

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);
    }
    
}
Run Code Online (Sandbox Code Playgroud)

  • 有人认为“这个答案没有用”。希望他能发布一个有用的答案。我很好奇。 (2认同)