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
.
有一个重要的区别:drawPolyline
您正在绘制一条多段线。你drawLine
正在绘制单独的线条。到目前为止,一切都很明显。但是这是什么意思?
Stroke
差异主要在为图形对象分配“重要”时出现- 通常是某个BasicStroke
. 这在构造函数中接收几个参数。关于你的问题,最重要的是join
参数。它可以是JOIN_BEVEL
、JOIN_METER
和JOIN_ROUND
。它决定两条 连接线的连接方式。显然,这只能在已知线路已连接的情况下应用,而这仅是呼叫中的情况drawPolyline
。它根本不能应用于个人drawLine
呼叫。
下面的屏幕截图显示了这种差异。它使用宽度为 15 且join=BasicStroke.JOIN_ROUND
. 左侧部分用 绘制drawPolyline
,右侧部分绘制为单独的线:
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)