熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

在Java中使用Draw2D和SWT繪圖

2013-11-23 19:08:44  來源: Java核心技術 

  用 Java繪圖一直都吸引著開發人員的注意傳統上Java 開發人員使用 javaawtGraphics 或 Java D API 進行繪圖一些開發人員甚至使用現成的開源工具箱(如 JSci)來繪圖但很多時候您的選擇被限定在了 AWT 或 Swing 上為了最大限度地減少對第三方工具箱的依賴或者為了簡化繪圖基礎可以考慮使用 DrawD並編寫自己的代碼來制圖或繪圖
  
  DrawD 簡介
  
  DrawD 是一個駐留在 SWT Composite 之上的輕量級窗口小部件系統一個 DrawD 實例 由一個 SWT Composite一個輕量級系統及其內容的圖形組成圖形 是 DrawD 的構建塊關於 DrawD API 的所有細節可以從 DrawD Developers Guide 的 Eclipse 幫助文件中找到因為本文不打算成為一篇講述 DrawD 的教程所以為了簡便起見只要您了解 DrawD API 可以幫助您在 SWT Canvas 上進行繪圖就足夠了您可以直接使用一些標准的圖形比如 EllipsePolylineRectangleFigure 和 Triangle或者您可以擴展它們來創建自己的圖形此外一些容器圖形如 Panel可以充當所有子圖形的總容器
  
  DrawD 有兩個重要的包orgeclipsedrawdgeometry 和 orgeclipsedrawdgraph本文中使用了這兩個包orgeclipsedrawdgeometry 包有一些有用的類比如 RectanglePoint 和 PointList這些類都是自我解釋的另一個包 orgeclipsedrawdgraph 開發人員使用的可能不是太多這個包提供了一些重要的類比如 DirectedGraphNodeEdgeNodeList 和 EdgeList這些類有助於創建圖表
  
  在本文中我將解釋如何使用 DrawD 編寫代碼幫助您以圖形的方式形象化您的數據我將從一項技術的描述開始該技術將位於某一范圍內的數據值(比如)按比例縮放成另一范圍內的等效數據值(例如然後我將舉例說明如何繪制出任意個級數的 XY 坐標圖每個級數都包含一組數據元素在學習了本文中的概念之後就可以很容易地繪制其他類型的圖表比如餅圖和條形圖
  
  具體的繪圖過程
  
  步驟 您想繪制什麼樣的圖形?
  
  顯然您想以圖形方式描繪來自數據源的數據所以您需要那些您想以圖形形式形象化的數據為了簡便起見我使用了一個名為 dataGenerator 的簡單函數生成的數據而不是從 XML 文件或其他一些數據源讀取數據該函數使用了一個 for(;;) 循環並以數組列表的形式返回生成的值
  
  清單 生成一些數據
  
  private ArrayList dataGenerator() {
  double series[] = new double[];
  for(int i=; 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[i] = (i*20) + 15;
  
  seriesData.add(series1);
  seriesData.add(series2);
  seriesData.add(series3);
  return seriesData;
  }
  
  步驟 2:縮放技術 —— 從給定的數據生成 X 坐標和 Y 坐標
  
  一些新的術語
  
  FigureCanvas
  Draw2D 中的 FigureCanvas 是 SWT Canvas 的一個擴展。tW.wIngwiT.CoMFigureCanvas 可以包含 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  xPositions[i]=
  (i+1)*sectionWidth;//dots spaced at distance of sectionWidth
  }
  return xPositions;
  }
  
  Y 坐標:Y 坐標是某一個點距離原點的縱向距離。計算 Y 坐標要將某一個值按比例從一個范圍縮放到另一個范圍。例如,給出相同的集合 {10,20,30,40},您可以看出,數據的范圍是 0 到 40,新的范圍就是 Y 坐標軸的跨度(高度)。假設 Y 坐標軸的高度為 400,那麼第一個元素(10)的高度將是100,第二個元素的高度將是 200,依此類推。
  
  通過以下例子,您可以更好地理解如何按比例將一個值從一個范圍縮放到另一個范圍:假定一個范圍的跨度是從 0 到 2048,而您打算將該范圍內的任意值(比如說 1024)縮放到另一個從 0 到 100 的范圍內,那麼您立刻就可以知道,等刻度值是 50。該縮放所遵循的三值線算法是:
  
  line 1---> 2048 / 1024 equals 2.
  line 2---> 100 - 0 equals 100.
  line 3---> / equals which is the desired scaled value
  
  步驟 您想在哪兒進行繪圖?
  
  您還需要進行繪圖的地方可以通過擴展 Eclipse ViewPart 和使用 SWT Composite 來創建您自己的視圖此外也可以使用從 main() 函數中調用的 SWT shell
  
  在擴展 Eclipse ViewPart 時至少必須實現兩個函數createPartControl(Composite parent) 和 setFocus()函數 createPartControl(Composite parent) 是在屏幕上繪制視圖時自動調用的您的興趣只在所接收的 SWT Composite 上因此將它傳遞給某個類然後通過對這個類進行編碼來繪制圖形
  
  清單 使用 Eclipse ViewPart 繪圖
  
  public class MainGraFixView extends ViewPart{
  public void createPartControl(Composite parent) {
  
  //create or get data in an arraylist
  ArrayList seriesData = dataGenerator();
  
  //instantiate a plotter and provide data to it
  DirectedGraphXYPlotter dgXYGraph = new DirectedGraphXYPlotter(parent);
  dgXYGraphsetData(seriesData);
  dgXYGraphplot(); //ask it to plot
  
  }
  public void setFocus() {
  }
  }
  
  步驟 您需要繪制哪種圖形?
  
  一旦擁有了數據以及想用來繪制圖形的區域就必須確定您需要哪種類型的可視化在本文中我演示了如何編寫代碼來創建 XY 坐標圖和線形圖一旦知道了繪制 XY 坐標圖的技術就應該能夠繪制出其他圖形比如條形圖和餅圖要想更多地了解 XY 坐標圖請參閱我為本文編寫的 DirectedGraphXYPlotter 類(參見所附源代碼中的 \src\GraFix\Plotters\DirectedGraphXYPlotterjava)
  
  步驟 創建自己的 XY 坐標圖
  
  XY 坐標圖應該能夠繪制出 D 飛機上的任意數量的級數線每個級數線都應該以圖形形式顯示出引用 X 和 Y 引用線的那些級數中的每個點的位置每個點都應該通過一條線連接到級數中的下一個點上通過使用表示一個點和一條線的 DrawD 圖形您應該能夠創建這樣一個坐標圖例如為了表示一個點我通過擴展 Ellipse 圖形創建了一個 Dot 圖形並使用 PolylineConnection 圖形來表示連接線
  
  Direc
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26349.html
  • 上一篇文章:

  • 下一篇文章:
  • Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.