Java 2D API 提供強大的幾何變換能力,通過 Graphics2D 的 translate()、rotate()、scale() 等方法可輕鬆實現文字旋轉、縮放、平移等視覺特效。本文演示以面板中心為原點,將文字環狀旋轉繪製 12 次的完整示例。

translate(width/2, height/2) 將繪圖原點移至面板中心
package java2d;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Rotate {
public static void main(String[] args) {
JFrame jf = new JFrame("Java 2D 文字旋轉");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.getContentPane().add(new RotatePanel());
jf.setPreferredSize(new Dimension(500, 400));
jf.pack();
jf.setLocationRelativeTo(null); // 居中顯示
jf.setVisible(true);
}
}
class RotatePanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
// 背景填充
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, getWidth(), getHeight());
String text = "Java 2D 旋轉";
Font font = new Font("宋體", Font.BOLD, 16);
Color[] colors = { Color.ORANGE, Color.LIGHT_GRAY };
g2d.setFont(font);
// 核心:平移原點到面板中心
g2d.translate(getWidth() / 2, getHeight() / 2);
// 旋轉繪製 12 次,每次 30 度
for (int i = 0; i < 12; i++) {
g2d.rotate(Math.PI / 6); // 30° = π/6 弧度
g2d.setPaint(colors[i % 2]);
g2d.drawString(text, 0, 0); // 在當前旋轉座標系原點繪製
}
}
}
| 方法 | 作用 | 參數說明 |
|---|---|---|
| translate(tx, ty) | 平移原點 | tx, ty:x/y 軸平移距離 |
| rotate(theta) | 繞原點旋轉座標系 | theta:弧度(順時針為正) |
| rotate(theta, x, y) | 繞指定點旋轉 | x, y:旋轉中心點 |
| scale(sx, sy) | 縮放座標系 | sx, sy:x/y 軸縮放比例 |
| setPaint(paint) | 設置繪製顏色/漸變/紋理 | Color 實現 Paint 接口 |
默認 drawString(text, 0, 0) 以文字基線左邊為原點。若需文字自轉(繞自身中心),需計算文字寬高並調整繪製位置:
FontMetrics fm = g2d.getFontMetrics(); int textWidth = fm.stringWidth(text); int textHeight = fm.getHeight(); // 在旋轉前調整:將文字中心對齊座標系原點 g2d.drawString(text, -textWidth/2, textHeight/4);
若需持續旋轉動畫,可在 paintComponent 外部維護角度變量,配合 Timer 定時 repaint():
private double angle = 0;
private Timer timer = new Timer(50, e -> {
angle += Math.PI / 18; // 每幀 +10°
repaint();
});
// paintComponent 中:
g2d.rotate(angle);
// 繪製邏輯...
順序很重要! 典型順序:translate → rotate → scale → draw
Java 2D 的仿射變換機制強大且直觀,掌握 Graphics2D 座標系變換組合,可實現豐富的圖形動畫與視覺特效。本例展示了最基礎的旋轉應用,擴展方向包括:多層嵌套變換、漸變填充、圖片旋轉縮放、複雜路徑構建等。