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/Swing | Draw2D + SWT |
Graphics2D | org.eclipse.draw2d.Graphics |
JPanel.paintComponent() | FigureCanvas.paintFigure() / Figure.paint() |
AffineTransform | Transform (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 之上。
現代替代方案
| 方案 | 特點 | 適用場景 |
| JavaFX Charts | 聲明式 API、CSS 樣式、動畫豐富、內建圖表類型 | 新桌面應用、JavaFX 技術棧 |
| JFreeChart | 功能最全、輸出格式多、Swing/AWT/服務端渲染 | 報表生成、伺服端圖片輸出 |
| XChart | API 簡潔、無依賴、支援 JavaFX/Swing/輸出圖片 | 快速原型、輕量級圖表 |
| ECharts (Java 包裝) | Web 技術棧、互動極豐富、前後端分離 | Web 應用、儀表板 |
- 上一篇文章: Java 規則引擎與 JSR-94 API 深度解析:架構、實現產品與標準化展望
- 下一篇文章: Java高級編程:使用打印服務API
Copyright ©
程式碼之家 All Rights Reserved