一、基本形状类
这些类用于绘制简单的标准几何形状。
1. 圆形 / 椭圆类
Ellipse2D
:椭圆基类,支持浮点精度。- 子类 :
Ellipse2D.Double
:双精度浮点坐标。Ellipse2D.Float
:单精度浮点坐标。
- 参数 :
x, y, width, height
(矩形边界框)。 - 特点:当宽高相等时为圆形,否则为椭圆。
- 子类 :
2. 矩形类
Rectangle2D
:矩形基类,支持浮点精度。- 子类 :
Rectangle2D.Double
:双精度浮点坐标。Rectangle2D.Float
:单精度浮点坐标。
- 参数 :
x, y, width, height
(左上角坐标和尺寸)。
- 子类 :
3. 圆角矩形类
RoundRectangle2D
:圆角矩形基类。- 子类 :
RoundRectangle2D.Double
:双精度浮点坐标。RoundRectangle2D.Float
:单精度浮点坐标。
- 参数 :
x, y, width, height, arcWidth, arcHeight
(arcWidth
和arcHeight
控制圆角大小)。
- 子类 :
4. 弧形类
Arc2D
:弧形基类。- 子类 :
Arc2D.Double
:双精度浮点坐标。Arc2D.Float
:单精度浮点坐标。
- 参数 :
x, y, width, height, startAngle, extent, type
。type
可选:OPEN
(开放式)、CHORD
(弦形)、PIE
(扇形)。
- 子类 :
5. 多边形类
Polygon
:整数精度的多边形,通过顶点数组定义。- 参数 :
xpoints[]
(X 坐标数组)、ypoints[]
(Y 坐标数组)、npoints
(顶点数量)。 - 特点:自动连接首尾顶点形成封闭图形。
- 参数 :
二、路径形状类
这些类用于绘制复杂的自定义形状。
1. 线段类
Line2D
:线段基类。- 子类 :
Line2D.Double
:双精度浮点坐标。Line2D.Float
:单精度浮点坐标。
- 参数 :起点
(x1, y1)
和终点(x2, y2)
。
- 子类 :
2. 二次贝塞尔曲线
QuadCurve2D
:二次贝塞尔曲线基类。- 子类 :
QuadCurve2D.Double
:双精度浮点坐标。QuadCurve2D.Float
:单精度浮点坐标。
- 参数 :起点
(x1, y1)
、控制点(ctrlx, ctrly)
、终点(x2, y2)
。
- 子类 :
3. 三次贝塞尔曲线
CubicCurve2D
:三次贝塞尔曲线基类。- 子类 :
CubicCurve2D.Double
:双精度浮点坐标。CubicCurve2D.Float
:单精度浮点坐标。
- 参数 :起点
(x1, y1)
、控制点 1(ctrlx1, ctrly1)
、控制点 2(ctrlx2, ctrly2)
、终点(x2, y2)
。
- 子类 :
4. 通用路径类
GeneralPath
:可组合多个线段和曲线,形成复杂形状。- 特点 :通过
moveTo()
、lineTo()
、curveTo()
等方法动态构建路径。
- 特点 :通过
5. 2D 路径类
Path2D
:增强版的GeneralPath
,支持浮点精度。- 子类 :
Path2D.Double
:双精度浮点坐标。Path2D.Float
:单精度浮点坐标。
- 子类 :
三、其他类
Area
:用于图形的布尔运算(并集、交集、差集)。RectangularShape
:抽象基类,包含Ellipse2D
和RoundRectangle2D
。Caret
相关类 :BasicTextUI.BasicCaret
、DefaultCaret
:文本编辑器中的光标,与绘图无关。
四、参数共同点与区别
1. 共同点
- 坐标精度 :所有类都有
Double
和Float
两个子类,分别表示双精度和单精度浮点坐标。 - 矩形边界框 :多数基本形状(如椭圆、矩形、圆角矩形)使用
(x, y, width, height)
定义边界框。
2. 区别
- 特殊参数 :
- 弧形 :额外需要
startAngle
(起始角度)、extent
(角度范围)、type
(类型)。 - 圆角矩形 :额外需要
arcWidth
和arcHeight
(圆角大小)。 - 贝塞尔曲线:需要控制点坐标,次数越高控制点越多。
- 弧形 :额外需要
- 构建方式 :
- 基本形状:通过构造函数直接定义。
- 路径形状:通过方法动态添加线段和曲线。
五、如何选择合适的类?
-
画圆 / 椭圆 :用
Ellipse2D.Double
,宽高设为相等。 -
画矩形 :用
Rectangle2D.Double
。 -
画圆角矩形 :用
RoundRectangle2D.Double
。 -
画弧形 / 扇形 :用
Arc2D.Double
,设置type
为PIE
。 -
画直线 :用
Line2D.Double
。 -
画曲线 :
- 简单曲线:
QuadCurve2D.Double
(一个控制点)。 - 复杂曲线:
CubicCurve2D.Double
(两个控制点)。
- 简单曲线:
-
画多边形 :用
Polygon
,定义顶点数组。 -
组合图形 :用
GeneralPath
或Path2D.Double
,通过方法拼接线段和曲线。javaimport java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.*; import javax.swing.*; public class ShapeDemo extends JPanel { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; // 1. 圆形 Ellipse2D circle = new Ellipse2D.Double(50, 50, 100, 100); g2.setColor(Color.RED); g2.fill(circle); // 2. 矩形 Rectangle2D rect = new Rectangle2D.Double(200, 50, 100, 80); g2.setColor(Color.BLUE); g2.fill(rect); // 3. 圆角矩形 RoundRectangle2D roundRect = new RoundRectangle2D.Double(350, 50, 100, 80, 20, 20); g2.setColor(Color.GREEN); g2.fill(roundRect); // 4. 弧形(扇形) Arc2D arc = new Arc2D.Double(50, 200, 100, 100, 0, 90, Arc2D.PIE); g2.setColor(Color.ORANGE); g2.fill(arc); // 5. 线段 Line2D line = new Line2D.Double(200, 200, 300, 300); g2.setColor(Color.BLACK); g2.draw(line); // 6. 二次贝塞尔曲线 QuadCurve2D quad = new QuadCurve2D.Double(350, 200, 400, 250, 450, 200); g2.setColor(Color.MAGENTA); g2.draw(quad); // 7. 三次贝塞尔曲线 CubicCurve2D cubic = new CubicCurve2D.Double(50, 350, 100, 400, 150, 300, 200, 350); g2.setColor(Color.CYAN); g2.draw(cubic); // 8. 多边形 int[] xPoints = {250, 300, 350, 320, 280}; int[] yPoints = {350, 300, 350, 400, 400}; Polygon polygon = new Polygon(xPoints, yPoints, 5); g2.setColor(Color.DARK_GRAY); g2.fill(polygon); } public static void main(String[] args) { JFrame frame = new JFrame("Shape Demo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new ShapeDemo()); frame.setSize(550, 500); frame.setVisible(true); } }