Graphics2D绘制图形文字

wen java案例 1

本文目录导读:

Graphics2D绘制图形文字

  1. 基本设置
  2. 绘制基本图形
  3. 高级图形绘制
  4. 文字绘制
  5. 使用GlyphVector绘制文字
  6. 完整示例

我来为您介绍Java Graphics2D绘制图形和文字的方法。

基本设置

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.font.*;
public class Graphics2DDemo extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        // 开启抗锯齿
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                            RenderingHints.VALUE_ANTIALIAS_ON);
        // 设置背景色
        g2d.setBackground(Color.WHITE);
        g2d.clearRect(0, 0, getWidth(), getHeight());
    }
}

绘制基本图形

private void drawShapes(Graphics2D g2d) {
    // 1. 绘制直线
    g2d.setColor(Color.RED);
    g2d.setStroke(new BasicStroke(2.0f));
    g2d.drawLine(50, 50, 200, 50);  // 起点(x1,y1)到终点(x2,y2)
    // 2. 绘制矩形
    g2d.setColor(Color.BLUE);
    g2d.drawRect(50, 80, 150, 100);       // 空心矩形
    g2d.fillRect(250, 80, 150, 100);      // 填充矩形
    // 3. 绘制圆角矩形
    g2d.setColor(Color.GREEN);
    g2d.drawRoundRect(50, 200, 150, 100, 20, 20);    // 空心圆角矩形
    g2d.fillRoundRect(250, 200, 150, 100, 20, 20);   // 填充圆角矩形
    // 4. 绘制椭圆和圆
    g2d.setColor(Color.ORANGE);
    g2d.drawOval(50, 330, 150, 100);     // 空心椭圆
    g2d.fillOval(250, 330, 100, 100);    // 填充圆
    // 5. 绘制弧形
    g2d.setColor(Color.MAGENTA);
    g2d.drawArc(50, 460, 150, 100, 0, 180);      // 空心弧
    g2d.fillArc(250, 460, 150, 100, 0, 180);     // 填充弧
}

高级图形绘制

private void drawAdvancedShapes(Graphics2D g2d) {
    g2d.setStroke(new BasicStroke(2.0f));
    // 1. 绘制多边形
    int[] xPoints = {100, 200, 250, 150, 50};
    int[] yPoints = {100, 80, 180, 250, 180};
    g2d.setColor(Color.CYAN);
    g2d.drawPolygon(xPoints, yPoints, 5);     // 空心多边形
    g2d.fillPolygon(xPoints, yPoints, 5);     // 填充多边形
    // 2. 贝塞尔曲线
    CubicCurve2D cubicCurve = new CubicCurve2D.Float();
    cubicCurve.setCurve(50, 300, 150, 100, 200, 500, 300, 300);
    g2d.setColor(Color.RED);
    g2d.draw(cubicCurve);
    // 3. 二次曲线
    QuadCurve2D quadCurve = new QuadCurve2D.Float();
    quadCurve.setCurve(50, 400, 150, 200, 300, 400);
    g2d.setColor(Color.BLUE);
    g2d.draw(quadCurve);
    // 4. 绘制任意形状
    GeneralPath path = new GeneralPath();
    path.moveTo(100, 500);
    path.lineTo(150, 550);
    path.curveTo(200, 500, 250, 600, 300, 500);
    path.closePath();
    g2d.setColor(new Color(100, 150, 200, 100));  // 半透明
    g2d.fill(path);
    g2d.setColor(Color.DARK_GRAY);
    g2d.draw(path);
}

文字绘制

private void drawText(Graphics2D g2d) {
    // 1. 基本文字绘制
    g2d.setColor(Color.BLACK);
    g2d.setFont(new Font("宋体", Font.PLAIN, 20));
    g2d.drawString("Hello World!", 50, 50);
    // 2. 设置字体样式
    Font font = new Font("Arial", Font.BOLD | Font.ITALIC, 24);
    g2d.setFont(font);
    g2d.setColor(Color.RED);
    g2d.drawString("加粗斜体文字", 50, 100);
    // 3. 文字旋转
    Graphics2D g2dRotate = (Graphics2D) g2d.create();
    g2dRotate.rotate(Math.toRadians(45), 200, 150);
    g2dRotate.setFont(new Font("微软雅黑", Font.PLAIN, 18));
    g2dRotate.setColor(Color.BLUE);
    g2dRotate.drawString("旋转文字", 200, 150);
    g2dRotate.dispose();
    // 4. 文字阴影效果
    g2d.setFont(new Font("仿宋", Font.PLAIN, 30));
    g2d.setColor(Color.GRAY);
    g2d.drawString("阴影效果", 53, 253);  // 阴影
    g2d.setColor(Color.BLACK);
    g2d.drawString("阴影效果", 50, 250);  // 正文字
    // 5. 获取字体度量信息
    g2d.setFont(new Font("Times New Roman", Font.PLAIN, 20));
    FontMetrics fm = g2d.getFontMetrics();
    String text = "字体度量测试";
    int textWidth = fm.stringWidth(text);
    int textHeight = fm.getHeight();
    int ascent = fm.getAscent();
    g2d.setColor(Color.BLACK);
    g2d.drawString(text, 50, 300);
    g2d.drawRect(50, 300 - ascent, textWidth, textHeight);  // 文字边界框
}

使用GlyphVector绘制文字

private void drawTextWithGlyphVector(Graphics2D g2d) {
    Font font = new Font("Serif", Font.BOLD, 36);
    String text = "特效文字";
    // 创建GlyphVector
    FontRenderContext frc = g2d.getFontRenderContext();
    GlyphVector gv = font.createGlyphVector(frc, text);
    // 获取每个字符的形状
    Shape glyphShape = gv.getOutline();
    // 设置渐变
    GradientPaint gradient = new GradientPaint(
        50, 400, Color.BLUE, 
        350, 400, Color.RED
    );
    g2d.setPaint(gradient);
    g2d.fill(glyphShape);
    // 描边
    g2d.setColor(Color.BLACK);
    g2d.setStroke(new BasicStroke(2.0f));
    g2d.draw(glyphShape);
}

完整示例

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
public class CompleteGraphicsDemo extends JPanel {
    public CompleteGraphicsDemo() {
        setPreferredSize(new Dimension(600, 600));
        setBackground(Color.WHITE);
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        // 开启抗锯齿
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                            RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
                            RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        // 保存原始变换
        AffineTransform oldTransform = g2d.getTransform();
        // 1. 绘制标题
        g2d.setFont(new Font("微软雅黑", Font.BOLD, 24));
        g2d.setColor(Color.BLACK);
        g2d.drawString("Graphics2D 图形文字综合示例", 150, 30);
        // 2. 绘制图形
        drawShapes(g2d);
        // 3. 绘制文字
        drawTextWithEffects(g2d);
        // 4. 绘制带边框的图形
        drawOutlinedShapes(g2d);
        // 恢复变换
        g2d.setTransform(oldTransform);
    }
    private void drawShapes(Graphics2D g2d) {
        // 图形
        g2d.setColor(new Color(100, 200, 100));
        g2d.fillOval(50, 50, 100, 100);
        g2d.setColor(new Color(200, 100, 100));
        g2d.fillRect(200, 50, 100, 100);
        g2d.setColor(new Color(100, 100, 200));
        g2d.fillRoundRect(350, 50, 100, 100, 30, 30);
    }
    private void drawTextWithEffects(Graphics2D g2d) {
        // 文字阴影
        g2d.setFont(new Font("宋体", Font.BOLD, 28));
        // 阴影
        g2d.setColor(new Color(150, 150, 150, 100));
        g2d.drawString("图形与文字", 53, 230);
        // 原文
        g2d.setColor(Color.BLUE);
        g2d.drawString("图形与文字", 50, 230);
        // 旋转文字
        Graphics2D g2dRotated = (Graphics2D) g2d.create();
        g2dRotated.rotate(Math.toRadians(-15), 150, 300);
        g2dRotated.setColor(Color.MAGENTA);
        g2dRotated.setFont(new Font("微软雅黑", Font.ITALIC, 20));
        g2dRotated.drawString("旋转的文字效果", 50, 300);
        g2dRotated.dispose();
    }
    private void drawOutlinedShapes(Graphics2D g2d) {
        // 带边框的图形
        g2d.setColor(Color.YELLOW);
        g2d.fillOval(100, 350, 80, 80);
        g2d.setColor(Color.ORANGE);
        g2d.setStroke(new BasicStroke(3.0f));
        g2d.drawOval(100, 350, 80, 80);
        // 多边形的边框
        int[] xPoints = {250, 300, 350, 300, 250};
        int[] yPoints = {350, 390, 350, 410, 390};
        g2d.setColor(new Color(255, 200, 100, 150));
        g2d.fillPolygon(xPoints, yPoints, 5);
        g2d.setColor(Color.RED);
        g2d.setStroke(new BasicStroke(2.0f));
        g2d.drawPolygon(xPoints, yPoints, 5);
    }
    public static void main(String[] args) {
        JFrame frame = new JFrame("Graphics2D Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new CompleteGraphicsDemo());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
  1. 抗锯齿:开启抗锯齿使图形边缘更平滑
  2. 字体设置:使用 Font 类设置字体、样式和大小
  3. 坐标变换:使用 rotate(), translate(), scale() 等方法
  4. 颜色控制:使用 Color 类设置颜色,支持透明度
  5. Stroke设置:使用 BasicStroke 控制线条宽度和样式
  6. 字体度量:使用 FontMetrics 获取文字尺寸信息

这些示例涵盖了 Graphics2D 绘制图形和文字的主要功能,您可以根据实际需求调整和扩展。

上一篇Color颜色值转换与使用

下一篇当前分类已是最新一篇

抱歉,评论功能暂时关闭!