[轉]JGraph 常見問題解答(續二)

核心

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());

  }

   該方法有許多種變形,因此我們將保留它,以使您可在應用程序中來實現它。(注意:在該操作中,父節點的邊會自動隱藏)。

(待續……)

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章