Stroke接口的实现类 BasicStroke类:可以给画笔设置一些效果
想象一下你在画画,当你用笔画线时,你可以选择粗一点的笔或者细一点的笔,还可以决定线条的末端是平的、圆的还是有个小箭头,甚至可以让线条看起来像虚线。BasicStroke 类就是 Java 世界里的 "神奇画笔",它能让你控制在屏幕上画出的线条是什么样子的!
BasicStroke 类能做什么?
- 控制线条的粗细(笔画宽度)
- 决定线条末端的形状(是平的、圆的还是有个小方块)
- 控制线条相交处的样式(是尖的、圆的还是平的)
- 创建虚线效果
- 控制虚线的偏移量
- ****************************************************************
-
BasicStroke 类的主要方法
-
1.设置线条宽度
-
BasicStroke(float width)
-
这个方法就像选择不同粗细的画笔,width 值越大,线条就越粗。
-
2.设置线条末端和相交处样式
BasicStroke(float width, int cap, int join)
cap
参数决定线条末端的样式(比如圆头、平头)join
参数决定线条相交处的样式(比如尖角、圆角)
3.创建虚线:
BasicStroke(float width, int cap, int join, float miterlimit, float[] dash, float dash_phase)
dash
参数是一个数组,定义了虚线的模式(比如 [5, 3] 表示实线 5 个单位,空白 3 个单位)dash_phase
参数控制虚线的起始偏移量import java.awt.*; import javax.swing.*; public class StrokeDemo extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; // 普通粗线 g2.setStroke(new BasicStroke(5.0f)); g2.drawLine(50, 50, 200, 50); // 圆头粗线 g2.setStroke(new BasicStroke(5.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL)); g2.drawLine(50, 80, 200, 80); // 虚线 float[] dashPattern = {10.0f, 5.0f, 3.0f, 5.0f}; g2.setStroke(new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, dashPattern, 0.0f)); g2.drawLine(50, 110, 200, 110); } public static void main(String[] args) { JFrame frame = new JFrame("Stroke Demo"); frame.add(new StrokeDemo()); frame.setSize(300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }
需要注意的地方
-
只适用于 Graphics2D:BasicStroke 是 Java 2D API 的一部分,所以你必须使用 Graphics2D 对象来应用它。
-
参数值的单位:所有的宽度和距离值都是以像素为单位的。
-
内存考虑:创建大量不同的 BasicStroke 对象可能会占用较多内存,所以如果可能,尽量重用相同的 stroke 对象。
-
抗锯齿:为了获得更平滑的线条效果,你可能需要启用抗锯齿:
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-
负值不允许:宽度和虚线模式中的值不能是负数,否则会抛出异常。
-
************************************************************************************************
-
BasicStroke(float width, int cap, int join)
构造函数中后面两个参数的具体含义和可用选项 -
cap 参数(线条末端样式):
-
cap 参数决定了线条末端的形状,就像你用马克笔画线时,线条的两端可以有不同的形状。BasicStroke 类提供了三种主要的 cap 样式:
-
BasicStroke.CAP_BUTT(平头):
- 线条末端是平的,直接截断,不会超出线条本身的宽度。
- 就像用一把锋利的刀把线条切断一样。
-
BasicStroke.CAP_ROUND(圆头):
- 线条末端是圆形的,会超出线条本身宽度的一半。
- 就像在直线的末端加了一个小半圆,让线条看起来更柔和。
-
BasicStroke.CAP_SQUARE(方头):
- 线条末端是方形的,会超出线条本身宽度的一半。
- 就像在直线的末端加了一个小方块,比平头稍微长一点。
-
join 参数(线条相交处样式)
join 参数决定了两条线条相交处的连接方式,就像拼图的边缘一样,有不同的连接方式。BasicStroke 类提供了三种主要的 join 样式:
-
BasicStroke.JOIN_MITER(尖角):
- 线条相交处形成一个尖角,适合需要锐利转角的情况。
- 就像两个三角形的尖端直接对接,形成一个尖锐的角。
-
BasicStroke.JOIN_ROUND(圆角):
- 线条相交处形成一个圆角,适合需要平滑转角的情况。
- 就像在转角处加了一个小圆弧,让连接看起来更圆润。
-
BasicStroke.JOIN_BEVEL(平角):
- 线条相交处形成一个平角,直接截断多余的部分。
-
import java.awt.*; import javax.swing.*; public class StrokeCapJoinDemo extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; // 设置抗锯齿,让线条更平滑 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 绘制不同cap样式的线条 g2.setStroke(new BasicStroke(20.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)); g2.drawLine(50, 50, 250, 50); g2.drawString("CAP_BUTT", 270, 55); g2.setStroke(new BasicStroke(20.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER)); g2.drawLine(50, 100, 250, 100); g2.drawString("CAP_ROUND", 270, 105); g2.setStroke(new BasicStroke(20.0f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER)); g2.drawLine(50, 150, 250, 150); g2.drawString("CAP_SQUARE", 270, 155); // 绘制不同join样式的线条 g2.setStroke(new BasicStroke(20.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)); g2.drawLine(50, 200, 150, 200); g2.drawLine(150, 200, 150, 300); g2.drawString("JOIN_MITER", 170, 250); g2.setStroke(new BasicStroke(20.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)); g2.drawLine(200, 200, 300, 200); g2.drawLine(300, 200, 300, 300); g2.drawString("JOIN_ROUND", 320, 250); g2.setStroke(new BasicStroke(20.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); g2.drawLine(350, 200, 450, 200); g2.drawLine(450, 200, 450, 300); g2.drawString("JOIN_BEVEL", 470, 250); } public static void main(String[] args) { JFrame frame = new JFrame("Stroke Cap and Join Demo"); frame.add(new StrokeCapJoinDemo()); frame.setSize(600, 400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }