调用drawPolyline()相对于遍历每一行并在Graphics2D类中调用drawLine()有什么好处吗?
例如:
graphics2d.drawPolyline(xPoints, yPoints, nPoints);
相对于:
for (MyBean line : myBeans) {
graphics2d.drawLine(line.getX1Point(), line.getY1Point(), line.getX2Point(), line.getY2Point());
}第一种是第二种方便的方法吗?
对AWT来说挺新鲜的。(我意识到第一个可能更简洁。)
编辑:,我调用BufferedImage.createGraphics()来实现Graphics2D。
发布于 2016-06-22 14:00:26
是的一个重要区别:使用drawPolyline,您正在绘制一条单一的折线。使用drawLine,您正在绘制单独的线条。到目前为止很明显。但这意味着什么呢?
这种区别主要表现在将一个“非平凡”的Stroke分配给图形对象时-通常是一个特定的BasicStroke。这将在构造函数中接收多个参数。关于您的问题,最重要的是join参数。它可以是JOIN_BEVEL,JOIN_METER和JOIN_ROUND。它决定了两个连接的线是如何连接的。显然,只有当已知线路是连接的时才能应用这一点,这只是drawPolyline调用中的情况。它根本不能应用于单个drawLine调用。
下面是显示这种差异的屏幕截图。它使用智慧为15的中风和join=BasicStroke.JOIN_ROUND。左边的部分用drawPolyline绘制,右边的部分画成单独的线条:

但是你通常不应该使用drawPolyline .
..。因为它已经过时了,而且有几个缺点。首先,创建调用它所需的数组是一个麻烦。更重要的是,它只接受int[]数组。
整个Java2D绘图基础结构最初集中在int坐标上,就像在Graphics#drawLine(int,int,int,int)中一样。这已经被推广了,Graphics2D方法在这里允许了更大的灵活性。因此,现在绘制折线的通常方法是创建一个包含polyline的Shape对象。在大多数情况下,这将是一个Path2D实例:
Path2D path = new Path2D.Double();
path.moveTo(x0,y0);
path.lineTo(x1,y1);
path.lineTo(x2,y2);
...
graphics2D.draw(path);不过,仅供参考,下面是用于创建上述映像的代码:
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);
}
}发布于 2016-06-22 06:30:28
请记住,Graphics2D是一个抽象类,因此您不知道正在使用的是哪个具体实现,因此我将使用使代码更简洁的任何方法。
我很少使用drawPolyline(),因为将坐标输入数组以传递给方法通常很麻烦。但是您还应该考虑创建一个GeneralPath对象,该对象可以传递给Graphics2D.draw(Shape)方法。绘制路径可能比为某些Graphics2D实现绘制单独的行更有效。偶尔我也会注意到,使用路径(而不是单独的行)输出的效果会稍微好一些,特别是如果线条颜色是部分透明的(有时可以看到更暗的点,其中各个行的端点重叠)。
https://stackoverflow.com/questions/37956734
复制相似问题