java swing 设置画笔

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);
            }
        }
        就像用一把刀把多余的角切掉,形成一个斜切面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值