首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
tellmenow (22)
cutemouse (22)
softj (78)
iiprogram (69)
qdzx2008 (50)
goodboy1881 (14)
wangchinaking (58)
fancyhf (1)
harrymeng (41)
yjz0065 (113)
CSDN - 文档中心 - Java 阅读:13186   评论: 0    参与评论
标题   JGraph 常见问题解答(续二)     选择自 nxyc_twz 的 Blog
关键字   JGraph 常见问题解答
出处   http://www.jgraph.com/faq.html

JGraph 常见问题解答(续二)

              翻译:nxyc_twz@163.com

 

 

核心

JGraph 是否可串行化?

  是,也不是。

  JGraph以及它的类支持短时期串行化,而不支持长时期串行化(使用 XMLEncoder) 。但是,在大多数情况下,短时期串行化对图形模式来说已经足够了。
  澄清:新的 API 分隔模式和视图。如果单独串行化模型,视觉属性(比如大小,位置,颜色等等) 不能被保存!通过重载GraphModel.isAttributeStore() 方法,JGraph 可以设置以存储视觉属性到模型中。通常,JGraph 的(短时期) 串行化不应该使用存储文件,而且不建议长时期 GraphModel 串行化。
  注意:文件格式依赖于应用且不包括在 JGraph 的核心 API 中。JGraph 组件通过 Swing 的长时期串行化来支持 XML,但现在只实现了短时期串行化。
  JGraphpad 中使用的文件格式是包括可串行化的模型单元的向量(比如对象数组), 这些单元间的连接(比如 ConnectionSet), 以及相应的视图间通讯 (GraphCell, CellView)。 (注意: 使用向量描述参数插入单元到 GraphModel 中) 可以参考在类com.jgraph.pad.GPGraph中的实现: getArchiveableState() 和 setArchiveableState() 方法。


怎样实现拖/?

  JGraph 对拖、放操作的支持完全适应两个Java版本(Java 1.3 和 Java 1.4)。
  Java 1.3 DnD 支持基于在Java API规范中说明的 Transferables, DropTargetListeners 和 DragSourceListeners 。(Java 1.4 版本使用 JComponent 的 TransferHandler.)
  拖、放是Java的一部分,而不JGraph独有的,JGraph 完全兼容 Swing 的拖、放。因此,我建议你检查Java文档的详细说明。例如,可以参考Java指南:http://java.sun.com/docs/books/tutorial/dnd/
  Java 1.3 版本的一个很好的拖、放示例可参考:http://www.javaworld.com/javaworld/jw-03-1999/jw-03-dragndrop.html
  Java 1.4 版本的 JGraph 使用 Swing 的新属性
TransferHandler

   public class MyTransferHandler extends TransferHandler {

       public boolean importData(JComponent comp, Transferable t) {

           Point p = getInsertionLocation();

           Object cell = graph.getCellForLocation(p.x, p.y);

           CellView view = graph.getMapping(cell);

           if (view instanceof GraphDropHandler)

               return ((GraphDropHandler) view).handle(p, t);

           else

               return super.importData(comp, t);

       }

   }

   graph.setTransferHandler(new MyTransferHandler());


怎样打开一个编辑对话框?

  使用 JGraph.startEditingAtCell(对象) 开始编辑单元。要编程改变标签,你可以使用 value 属性:

   Map change = GraphConstants.createMap();

   GraphConstants.setValue(change, "Hello World!");

   Map nest = new Hashtable();

   nest.put(cell, change);

   model.edit(nest, null, null, null);


怎样在事件句柄中反映缩放?

  JGraph 提供了两种方法: fromScreen 方法,用来传送鼠标事件给模型;toScreen 方法,用来传送模型到缩放的屏幕中。这些方法的命名习惯基于实际情况,比如屏幕上的单元和它的视觉描述可能有所不同,需要传送 "从屏幕" 到单元,反之亦然("到屏幕")。
  典型地,常用下列方法:

   public void mousePressed(MouseEvent e) {

       Point point = graph.fromScreen(new Point(e.getPoint()));

       cell = graph.getNextViewAt(null, point.x, point.y);

   }

  注意: getFirstCellAtgetNextCellAt 方法不需要缩放它们的参数。


用户对象在编辑后否可设置为字符串?

  JGraph 提供了处理该问题的接口 DefaultGraphCell.ValueChangeHandler。如果你定制的用户对象实现了该接口,它在被编辑时就不会被重写。同时,DefaultGraphCell 调用用户对象的带有新参数值的 valueChanged 方法(新值是字符串),并期待它返回原值(使用同样的机制实现修改后的撤消功能)。该返回值可以是 valueChanged 方法可处理的任何对象。


调试输出仅包含空字符串吗?

  当使用形如 System.out.println(cell) 的代码时,应记住方法 DefaultGraphCells toString 被指向可能为空的字符串的用户对象。该方法继承自 Swing 的 DefaultTreeNode。


怎样检测四周限制?

使用 DefaultGraphModel.contains 方法。


怎样收缩/展开/隐藏单元?

  GraphLayoutCache 必须是 "局部性的"。你可以使用以下代码来创建局部性的 GraphLayoutCache :

  JGraph graph = new JGraph();

  GraphLayoutCache cache = new GraphLayoutCache(graph, graph.getModel(), false, true);

  graph.setGraphLayoutCache(cache);

 下面的代码成功实现了显示及隐藏顶点及其父节点:

  Object[] cells = getSelectionCells();

  if (cells != null) {//如果选定了单元则

      LinkedList children = new LinkedList();

      for (int i = 0; i < cells.length; i++) {

          for (int j = 0; j < model.getChildCount(cells[i]); j++)

              children.add(model.getChild(cells[i], j));

      }

      Object[] childs = children.toArray();

      graph.getGraphLayoutCache().setVisible(childs, cells);

      graph.setSelectionCells(getSelectionCells());

  }

   该方法有许多种变形,因此我们将保留它,以使您可在应用程序中来实现它。(注意:在该操作中,父节点的边会自动隐藏)。

(待续……)


相关文章
对该文的评论