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

Java Draw2D 與 SWT 繪圖實戰:從數據縮放到多序列 XY 圖表繪製

     編輯:Java 程式設計入門

Draw2D 核心概念

  • FigureCanvas:SWT Canvas 子類,承載 Draw2D 輕量級圖形樹。
  • Figure:基本繪圖單元(RectangleFigure、Ellipse、Polyline、Triangle 等)。
  • Panel:容器圖形,管理子圖形佈局。
  • geometry 套件:Rectangle、Point、PointList 等幾何工具類。
  • graph 套件:DirectedGraph、Node、Edge 等圖論佈局支援。

數據縮放核心算法:座標映射

將資料域 [dataMin, dataMax] 線性映射到像素域 [pixelMin, pixelMax]:


double scale = (pixelMax - pixelMin) / (dataMax - dataMin);
int pixel = pixelMin + (int) ((dataValue - dataMin) * scale);

X 軸座標計算(等寬分段)


private int[] calculateXPositions(ArrayList<double[]> seriesData, int xSpan) {
    int maxPoints = seriesData.stream().mapToInt(arr -> arr.length).max().orElse(0);
    int segmentWidth = xSpan / maxPoints;
    int[] xPos = new int[maxPoints];
    for (int i = 0; i < maxPoints; i++) {
        xPos[i] = (i + 1) * segmentWidth; // 從第一段開始
    }
    return xPos;
}

Y 軸座標計算(數值映射)


private int calculateY(double value, double yMin, double yMax, int ySpan, int yOrigin) {
    // yOrigin 為像素座標系原點(通常左上角),Y 軸向下增長
    double scale = ySpan / (yMax - yMin);
    return yOrigin - (int) ((value - yMin) * scale);
}

多序列 XY 折線圖完整實作骨架


public class MultiSeriesChart extends FigureCanvas {
    private List<double[]> seriesData;
    private Color[] seriesColors = { ColorConstants.red, ColorConstants.blue, ColorConstants.green };

    public MultiSeriesChart(Composite parent, int style) {
        super(parent, style);
        setScrollBarVisibility(FigureCanvas.NEVER);
        // 背景面板
        Panel panel = new Panel();
        panel.setLayoutManager(new FreeformLayout());
        setContents(panel);

        // 座標軸、網格、圖例等 Figure 加入 panel
        // ...
    }

    public void setData(List<double[]> data) {
        this.seriesData = data;
        refresh(); // 觸發重繪
    }

    @Override
    protected void paintFigure(Graphics graphics) {
        if (seriesData == null) return;
        // 1. 計算全域數值範圍
        double yMin = ..., yMax = ...;
        int xSpan = getBounds().width - MARGIN_LEFT - MARGIN_RIGHT;
        int ySpan = getBounds().height - MARGIN_TOP - MARGIN_BOTTOM;

        // 2. 計算 X 座標
        int[] xCoords = calculateXPositions(seriesData, xSpan);

        // 3. 繪製每個序列
        for (int s = 0; s < seriesData.size(); s++) {
            double[] series = seriesData.get(s);
            Polyline line = new Polyline();
            for (int i = 0; i < series.length; i++) {
                int x = MARGIN_LEFT + xCoords[i];
                int y = MARGIN_TOP + calculateY(series[i], yMin, yMax, ySpan, ySpan);
                line.addPoint(new Point(x, y));
            }
            line.setForegroundColor(seriesColors[s % seriesColors.length]);
            line.setLineWidth(2);
            // 加入 panel 或直接繪製
        }
    }
}

關鍵 API 對照

傳統 AWT/SwingDraw2D + SWT
Graphics2Dorg.eclipse.draw2d.Graphics
JPanel.paintComponent()FigureCanvas.paintFigure() / Figure.paint()
AffineTransformTransform (Draw2D 3.x+)
手動佈局LayoutManager (ToolbarLayout, FlowLayout, StackLayout...)
滑鼠事件MouseListener on Figure / FigureCanvas

優勢與適用場景

  • 輕量級:不創建重量級 Peer 元件,記憶體佔用低、啟動快。
  • SWT 整合:無縫嵌入 Eclipse RCP、SWT 應用,共享原生外觀。
  • 模型-視圖分離:Figure 樹即場景圖,支援命中測試、動畫、匯出 SVG/PDF。
  • 圖表庫基礎:Eclipse BIRT、Nebula Widgets、Zest 圖視覺化皆建構於 Draw2D 之上。

現代替代方案

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案特點適用場景
JavaFX Charts聲明式 API、CSS 樣式、動畫豐富、內建圖表類型新桌面應用、JavaFX 技術棧
JFreeChart功能最全、輸出格式多、Swing/AWT/服務端渲染報表生成、伺服端圖片輸出
XChartAPI 簡潔、無依賴、支援 JavaFX/Swing/輸出圖片快速原型、輕量級圖表
ECharts (Java 包裝)Web 技術棧、互動極豐富、前後端分離Web 應用、儀表板