首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 2D 繪圖入門:使用 Graphics2D 繪製直線與基本幾何圖形

     編輯:Java 綜合教學

Java 2D 繪圖入門:使用 Graphics2D 繪製直線與基本幾何圖形

核心架構

Java 2D API 建立在 java.awt 與 javax.swing 之上,核心繪圖上下文為 Graphics2D(繼承自 Graphics),提供幾何圖形、顏色、筆觸、字型、渲染提示等高階功能。

繪製直線完整範例

1. 基本框架

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);
        });
    }
}

2. 核心繪製方法

方法說明參數
drawLine(x1, y1, x2, y2)繪製直線起點/終點座標
draw(Shape s)繪製任意 Shape 介面實作Line2D、Rectangle2D、Ellipse2D 等
fill(Shape s)填充圖形內部同 draw()

3. 線條樣式控制

// 設定顏色
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);

4. 使用 Line2D 物件導向繪製

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 可組合多重變換。

效能優化建議

  1. 複用 Graphics2D 設定:在 paintComponent 外建立 Stroke、Paint 物件,避免重複建立。
  2. 裁剪區域:g2d.setClip(x, y, w, h) 限制繪製範圍。
  3. 雙緩衝:Swing 元件預設開啟雙緩衝,減少閃爍。
  4. 大量圖形:考慮離屏緩衝(BufferedImage)或 JavaFX Canvas。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved