Java中使用Draw2D和SWT绘图

豆豆网   技术应用频道   2007年07月23日    社区交流

内容摘要:您的选择被限定在了 AWT 或 Swing 上。为了最大限度地减少对第三方工具箱的依赖,或者为了简化绘图基础,可以考虑使用 Draw2D,并编写自己的代码来制图或绘图。

  找出每个元素的 X 坐标和 Y 坐标,将它们存储在 node.x 和 node.y 成员变量中。

  创建一个 EdgeList,在该列表中,有 n -1 个 Edge,其中,n 是集合中的元素的数量。例如,集合 {10,20,30,40} 需要三个 Edge。

  将 Node 与每个 Edge 的左右端相关联,并相应地设置 edge.start 和 edge.end 成员变量。

  部分 B —— 通过以下步骤绘制表示 Node 和 Edge 的图形:

  绘制一个 Dot 图来表示每个 Node。

  绘制一个 PolylineConnection 图形来表示每个 Edge。

  界定每个 PolylineConnection 图形,以固定 Dot 图的左右端。

  现在,回到内部函数的工作上来:

  函数 populateNodesAndEdges() 实现了该技术的部分 A,而函数 drawDotsAndConnections() 则实现了该技术的部分 B。

  函数 populateNodesAndEdges() 计算将绘制多少级数。它为每个级数创建了一个 NodeList 和一个 EdgeList。

  每个 NodeList 都包含一个用于特殊级数的 Node 的列表。每个 Node 都保存着关于应该在什么地方绘制 X 坐标和 Y 坐标的信息。函数 getXCoordinates() 和 getYCoordinates() 分别用于检索 X 坐标值和 Y 坐标值。使用步骤 2 中的相同算法,这些函数也可以内部地将数据值按比例从一个范围缩放到另一个范围。

  每个 EdgeList 都包含一个用于特殊级数的 Edges 的列表。每个 Edge 的左右端上都分别有一个 Node。

  清单 6. populateNodesAndEdges() 函数

private void populateNodesAndEdges(){
   
  _seriesScaledValues = new ArrayList(getScaledValues(_seriesData));
 _nodeLists = new ArrayList();
 _edgeLists = new ArrayList();
 
 for(int i=0; i<_numSeries; i++){
  _nodeLists.add(new NodeList());// one NodeList per series.
  _edgeLists.add(new EdgeList());// one EdgeList per series.
 }
 //populate all NodeLists with the Nodes. 
 for(int i=0; i<_numSeries; i++){//for each series
  double data[] = (double[])_seriesData.get(i);//get the series
  int xCoOrds[] = getXCoordinates(_seriesData);
  int yCoOrds[] = getYCoordinates(i, data);
  //each NodeList has as many Nodes as points in a series
  for(int j=0; j<data.length; j++){
  Double doubleValue = new Double(data[j]);
  Node node = new Node(doubleValue);
  node.x = xCoOrds[j];
  node.y = yCoOrds[j];  
  ((NodeList)_nodeLists.get(i)).add(node);
  }   
 }
 //populate all EdgeLists with the Edges. 
 for(int i=0; i<_numSeries; i++){
  NodeList nodes = (NodeList)_nodeLists.get(i);  
  for(int j=0; j<nodes.size()-1; j++){
  Node leftNode = nodes.getNode(j);
  Node rightNode = nodes.getNode(j+1);
  Edge edge = new Edge(leftNode,rightNode);
  edge.start = new Point(leftNode.x, leftNode.y); 
  edge.end = new Point(rightNode.x, rightNode.y);
  ((EdgeList)_edgeLists.get(i)).add(edge);
  } 
 }
 int breakpoint = 0;
}

责编:豆豆技术应用

正在加载评论...