用 Java繪圖一直都吸引著開發人員的注意。傳統上,Java 開發人員使用 java.awt.Graphics 或 Java 2D API 進行繪圖。一些開發人員甚至使用現成的開源工具箱(如 JSci)來繪圖。但很多時候,您的選擇被限定在了 AWT 或 Swing 上。為了最大限度地減少對第三方工具箱的依賴,或者為了簡化繪圖基礎,可以考慮使用 Draw2D,並編寫自己的代碼來制圖或繪圖。
幸運好時機,注冊贏手機
2005 三星yepp夏季數碼旅游風
Draw2D 簡介Draw2D 是一個駐留在 SWT Composite 之上的輕量級窗口小部件系統。一個 Draw2D
實例 由一個 SWT Composite、一個輕量級系統及其內容的圖形組成。
圖形 是 Draw2D 的構建塊。關於 Draw2D API 的所有細節,可以從 Draw2D Developer’s Guide 的 Eclipse 幫助文件中找到。因為本文不打算成為一篇講述 Draw2D 的教程,所以,為了簡便起見,只要您了解 Draw2D API 可以幫助您在 SWT Canvas 上進行繪圖就足夠了。您可以直接使用一些標准的圖形,比如 Ellipse、Polyline、RectangleFigure 和 Triangle,或者,您可以擴展它們來創建自己的圖形。此外,一些容器圖形,如 Panel,可以充當所有子圖形的總容器。
Draw2D 有兩個重要的包:org.eclipse.draw2d.geometry 和 org.eclipse.draw2d.graph,本文中使用了這兩個包。org.eclipse.draw2d.geometry 包有一些有用的類,比如 Rectangle、Point 和 PointList,這些類都是自我解釋的。另一個包 org.eclipse.draw2d.graph 開發人員使用的可能不是太多。這個包提供了一些重要的類,比如 DirectedGraph、Node、Edge、NodeList 和 EdgeList,這些類有助於創建圖表。
在本文中,我將解釋如何使用 Draw2D 編寫代碼,幫助您以圖形的方式形象化您的數據。我將從一項技術的描述開始,該技術將位於某一范圍內的數據值(比如,從 0 到 2048)按比例縮放成另一范圍內的等效數據值(例如,從 0 到 100)。然後,我將舉例說明如何繪制出任意個級數的 X-Y 坐標圖,每個級數都包含一組數據元素。在學習了本文中的概念之後,就可以很容易地繪制其他類型的圖表,比如餅圖和條形圖。
具體的繪圖過程步驟 1:您想繪制什麼樣的圖形?
顯然,您想以圖形方式描繪來自數據源的數據。所以,您需要那些您想以圖形形式形象化的數據。為了簡便起見,我使用了一個名為 dataGenerator 的簡單函數生成的數據,而不是從 XML 文件或其他一些數據源讀取數據,該函數使用了一個 for(;;) 循環,並以數組列表的形式返回生成的值。
清單 1. 生成一些數據
private ArrayList dataGenerator() {
double series1[] = new double[5];
for(int i=0; i<series1.length; i++)
series1[i] = (i*10) + 10; // a linear
series containing 10,20,30,40,50
double series2[] = new double[9];
series2[0] = 20; series2[1] = 150; series2[2] = 5;
series2[3] = 90; series2[4] = 35; series2[5] = 20;
series2[6] = 150; series2[7] = 5; series2[8] = 45;
double series3[] = new double[7];
for(int i=0; i<series3.length; i++)
series3[i] = (i*20) + 15;
seriesData.add(series1);
seriesData.add(series2);
seriesData.add(series3);
return seriesData;
}
步驟 2:縮放技術 —— 從給定的數據生成 X 坐標和 Y 坐標
一些新的術語
- FigureCanvas
- Draw2D 中的 FigureCanvas 是 SWT Canvas 的一個擴展。FigureCanvas 可以包含 Draw2D 圖形。
- Panel
- Panel 是 Draw2D 中的一個通用容器圖形,它可以包含子圖形。您可以向一個 Panel 圖形中添加許多圖形,然後將這個 Panel 圖形提供給 FigureCanvas。
- DirectedGraph
- DirectedGraph 是一個 2-D 圖形,擁有有限數量的 Node,每個 Node 都位於一些 Point 中,相鄰的 Node 是通過 Edges 彼此連接在一起的。
當您想繪制一架 2-D 飛機上的點時,必須找出每個點的 X 坐標和 Y 坐標。繪圖的奇妙之處在於能夠將某一個給定數據值從一個范圍按比例縮放到另一個范圍中,也就是說,如果給定一組值,如 {10,20,30},那麼您應該能夠確定 2-D 飛機上具體哪些點(X 坐標和 Y 坐標)表示的是 10、20 和 30 這些數據值。
繪制總是在按照某一個限定縮放比例進行的。換句話說,在同一限定區域內,可以繪制任意數量的點。因為該區域是固定的,所以您總是可以找到 X 坐標軸的跨度(長度)和 Y 坐標軸的跨度(高度)。X 坐標軸和 Y 坐標軸的跨度只是等式的一部分。另一部分是找出數據值的范圍,並根據每個數據值在新范圍內的等效值來計算這些值的坐標。
計算 X 坐標和 Y 坐標
X 坐標:X 坐標是某一個點距離原點的水平距離。計算元素的數量,然後將 X 坐標軸的跨度分成
n 個區段,其中,
n 是給定集合中的元素的數量,通過這種方式,可以計算某一集合中的所有點的橫向坐標。用這種分割方法可以獲得每個區段的長度。集合中的第一個點位於等於區段長度的第一段距離內。後續的每個點則位於區段長度加上原點到前一個點的距離的那一段距離內。
例如,給出一個集合 {10,20,30,40},您立刻就可以知道要繪制 4 個點,因為集合中包含 4 個元素。所以,應該將 X 坐標軸的跨度分成 4 個相等的區段,每個區段的長度 = 跨度/4。因此,如果 X 坐標軸的跨度是 800,那麼區段的長度將是 800/4,即 200。第一個元素(10)的 X 坐標將是 200,第二個元素(20)的 X 坐標將是 400,依此類推。
清單 2. 計算 X 坐標
private int[] getXCoordinates(ArrayList seriesData){
int xSpan = (int)GraFixConstants.xSpan;
int longestSeries = Utilities.getLongestSeries(seriesData);
int numSegments =
((double[])seriesData.get(longestSeries)).length;
int sectionWidth =
(int)xSpan / numSegments; //want to divide span of xAxis
int xPositions[] =
new int[numSegments]; // will contain X-coordinate of all dots.
for(int i=0; i<numSegments; i++){
xPositions[i]=
(