本文目录导读:

我来为您介绍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);
}
}
- 抗锯齿:开启抗锯齿使图形边缘更平滑
- 字体设置:使用
Font类设置字体、样式和大小 - 坐标变换:使用
rotate(),translate(),scale()等方法 - 颜色控制:使用
Color类设置颜色,支持透明度 - Stroke设置:使用
BasicStroke控制线条宽度和样式 - 字体度量:使用
FontMetrics获取文字尺寸信息
这些示例涵盖了 Graphics2D 绘制图形和文字的主要功能,您可以根据实际需求调整和扩展。