Java Swing绘图基础
Java Swing提供了强大的图形绘制功能,通过java.awt.Graphics和java.awt.Graphics2D类,开发者可以在组件上实现自定义绘图,绘图的核心在于重写组件的paint()或paintComponent()方法,确保图形在组件渲染时正确显示,以下是Swing绘图的详细实现步骤和关键技巧。

绘图环境准备
Swing绘图通常基于JPanel或JFrame等容器组件,需要创建一个自定义的绘图组件,并重写其paintComponent()方法,注意:应优先调用super.paintComponent(g),以保留组件的默认渲染行为(如背景色填充)。
import javax.swing.*;
import java.awt.*;
public class DrawingPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); // 必须调用,避免渲染异常
Graphics2D g2d = (Graphics2D) g; // 转换为Graphics2D以启用高级功能
// 绘图代码将在此处添加
}
}
在main()方法中,将此面板添加到JFrame并设置可见性:
JFrame frame = new JFrame("Swing绘图示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new DrawingPanel());
frame.setSize(800, 600);
frame.setVisible(true);
基本图形绘制
Graphics2D类提供了绘制基本图形的方法,包括直线、矩形、圆形、多边形等,以下为常见图形的绘制示例:
绘制直线与折线
使用drawLine(int x1, int y1, int x2, int y2)绘制直线,或通过drawPolyline(int[] xPoints, int[] yPoints, int nPoints)绘制折线。
g2d.drawLine(50, 50, 200, 200); // 绘制从(50,50)到(200,200)的直线
int[] xPoints = {50, 100, 150};
int[] yPoints = {250, 200, 250};
g2d.drawPolyline(xPoints, yPoints, 3); // 绘制三角形折线
绘制矩形与椭圆
- 矩形:
drawRect(int x, int y, int width, int height)(边框)或fillRect(int x, int y, int width, int height)(填充)。 - 椭圆:
drawOval(int x, int y, int width, int height)或fillOval(int x, int y, int width, int height)。
g2d.drawRect(50, 50, 100, 80); // 绘制矩形边框 g2d.setColor(Color.BLUE); // 设置填充颜色 g2d.fillOval(200, 50, 100, 80); // 绘制填充椭圆
绘制圆弧与多边形
- 圆弧:
drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)。 - 多边形:
drawPolygon(int[] xPoints, int[] yPoints, int nPoints)或fillPolygon()。
g2d.drawArc(50, 150, 100, 100, 0, 180); // 绘制半圆弧
int[] polygonX = {200, 250, 300, 250};
int[] polygonY = {150, 200, 150, 100};
g2d.fillPolygon(polygonX, polygonY, 4); // 填充菱形
图形样式与颜色控制
通过Graphics2D的属性设置方法,可以自定义图形的颜色、线条粗细、字体等样式。

颜色与透明度
使用setColor(Color c)设置颜色,setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha))设置透明度(0.0为完全透明,1.0为不透明)。
g2d.setColor(new Color(255, 0, 0, 128)); // 半透明红色 g2d.fillRect(50, 300, 100, 80);
线条样式
通过setStroke(Stroke s)设置线条样式,例如BasicStroke可定义线条粗细、虚线等:
g2d.setStroke(new BasicStroke(3.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); g2d.drawLine(50, 400, 200, 400); // 粗圆角线条
字体与文本
使用setFont(Font font)设置字体,drawString(String str, int x, int y)绘制文本:
g2d.setFont(new Font("宋体", Font.BOLD, 20));
g2d.drawString("Java Swing绘图", 50, 450);
高级绘图技巧
图像绘制
使用drawImage(Image img, int x, int y, ImageObserver observer)加载并显示图像:
try {
Image img = ImageIO.read(new File("example.png"));
g2d.drawImage(img, 50, 500, this);
} catch (IOException e) {
e.printStackTrace();
}
坐标变换
Graphics2D支持平移、旋转、缩放等变换,通过translate(int x, int y)、rotate(double theta)等方法实现:

g2d.translate(300, 300); // 原点平移至(300,300) g2d.rotate(Math.toRadians(45)); // 旋转45度 g2d.drawRect(-50, -50, 100, 100); // 围绕新原点绘制矩形
双缓冲技术
为避免绘图闪烁,可启用双缓冲:在JPanel构造函数中调用setDoubleBuffered(true),或手动创建BufferedImage进行离屏绘制。
动态绘图与事件响应
通过重写paintComponent()并结合事件监听(如鼠标事件),可实现交互式绘图,监听鼠标拖动绘制自由曲线:
private List<Point> points = new ArrayList<>();
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setStroke(new BasicStroke(2.0f));
for (int i = 1; i < points.size(); i++) {
Point p1 = points.get(i-1);
Point p2 = points.get(i);
g2d.drawLine(p1.x, p1.y, p2.x, p2.y);
}
}
// 添加鼠标监听器
this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
points.add(e.getPoint());
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
points.add(e.getPoint());
repaint(); // 重绘组件
}
});
Java Swing绘图的核心在于灵活运用Graphics2D类的方法,结合组件重绘和事件处理,可实现从简单图形到复杂交互界面的各种需求,开发者需注意合理管理绘图上下文、优化渲染性能,并通过实践掌握样式控制与动态绘图的技巧。

















