Java 2D API 建立在 java.awt 與 javax.swing 之上,核心繪圖上下文為 Graphics2D(繼承自 Graphics),提供幾何圖形、顏色、筆觸、字型、渲染提示等高階功能。
import javax.swing.*;
import java.awt.*;
public class LineDrawingDemo extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
// 啟用抗鋸齒,讓線條更平滑
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
// 繪製邏輯...
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("Java 2D 直線繪製示範");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new LineDrawingDemo());
frame.setSize(600, 400);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
});
}
}
| 方法 | 說明 | 參數 |
|---|---|---|
drawLine(x1, y1, x2, y2) | 繪製直線 | 起點/終點座標 |
draw(Shape s) | 繪製任意 Shape 介面實作 | Line2D、Rectangle2D、Ellipse2D 等 |
fill(Shape s) | 填充圖形內部 | 同 draw() |
// 設定顏色
g2d.setColor(Color.BLUE);
// 或 g2d.setPaint(new GradientPaint(...)); // 漸層
// 設定筆觸:寬度、端點樣式、連接樣式、虛線模式
float[] dashPattern = {10f, 5f}; // 10px 實線、5px 空白
BasicStroke stroke = new BasicStroke(
3.0f, // 線寬 3px
BasicStroke.CAP_ROUND, // 端點圓角
BasicStroke.JOIN_ROUND, // 連接圓角
10f, // 斜接限制
dashPattern, // 虛線模式
0f // 虛線偏移
);
g2d.setStroke(stroke);
// 繪製虛線
g2d.drawLine(50, 50, 300, 50);
import java.awt.geom.Line2D;
// 浮點數精度座標
Line2D.Double line = new Line2D.Double(50.5, 100.5, 350.5, 100.5);
g2d.draw(line);
// 也可用整數版本
Line2D.Float line2 = new Line2D.Float(50, 150, 350, 150);
g2d.draw(line2);
public class LineStylesDemo extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int y = 50;
// 1. 實線
g2d.setStroke(new BasicStroke(2));
g2d.drawLine(50, y, 400, y);
g2d.drawString("實線 2px", 410, y + 5);
// 2. 粗實線
y += 40;
g2d.setStroke(new BasicStroke(5));
g2d.drawLine(50, y, 400, y);
g2d.drawString("粗實線 5px", 410, y + 5);
// 3. 虛線
y += 40;
g2d.setStroke(new BasicStroke(2, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER, 10, new float[]{10, 5}, 0));
g2d.drawLine(50, y, 400, y);
g2d.drawString("虛線 10-5", 410, y + 5);
// 4. 點線
y += 40;
g2d.setStroke(new BasicStroke(2, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND, 10, new float[]{2, 8}, 0));
g2d.drawLine(50, y, 400, y);
g2d.drawString("點線 2-8", 410, y + 5);
// 5. 雙色虛線(自定義 Paint)
y += 40;
g2d.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND, 10, new float[]{15, 5, 5, 5}, 0));
g2d.setPaint(new Color(0xFF6B6B)); // 珊瑚紅
g2d.drawLine(50, y, 400, y);
g2d.drawString("複合虛線", 410, y + 5);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("線條樣式大全");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new LineStylesDemo());
frame.setSize(600, 400);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
});
}
}
(0,0) 位於元件左上角,X 向右、Y 向下。g2d.translate(x, y) 平移原點、g2d.rotate(theta) 旋轉、g2d.scale(sx, sy) 縮放。AffineTransform 可組合多重變換。paintComponent 外建立 Stroke、Paint 物件,避免重複建立。g2d.setClip(x, y, w, h) 限制繪製範圍。BufferedImage)或 JavaFX Canvas。