[英]How do I use JUNG2 in a MVC-gui?
我當時在玩JUNG2,並想實現一個小的GUI,使我可以顯示和更改Graph。 遵循JUNG庫中的示例可以很好地工作,但是它們沒有將模型,視圖和控制器分開。 因此,我開始以清晰的分離來構建GUI。
我的第一個GUI版本應該只是顯示初始圖形。 視圖是模型的觀察者,只要圖形發生更改,該通知就會在圖形的初始化步驟中恰好發生一次,並獲得通知。 但是,該圖並沒有顯示在屏幕的中央(就像在非MVC示例中一樣),但是我可以在左上角看到它的一小部分。
現在,這引出了一個普遍的問題:我如何告訴jung可視化組件模型已更改? 以及以后的內容:如何使用現成的組件,例如MVC體系結構中的Jung-Mouse? JUNG似乎混合了模型,視圖和控制器,但我不確定如何以及在何處正確使用它們。
編輯: Jung教程顯示了如何使用鼠標來管理更改,但未顯示如何根據模型中的更改來更改視圖(通過其他選項,例如按鈕“添加節點”或其他)
到目前為止,這是我的第一次嘗試:
風景
public class MOCView implements GraphChangeObserver {
private final ControllerInterface controller;
private final MOCModelInterface model;
private Layout<Node, Edge> layout;
private BasicVisualizationServer<Node, Edge> visualization;
private JFrame frame;
public MOCView(final ControllerInterface controller,
final MOCModelInterface model) {
this.controller = controller;
this.model = model;
model.registerObserver(this);
}
public void createView() {
this.layout = new CircleLayout<Node, Edge>(this.model.getGraph());
this.layout.setSize(new Dimension(300, 300));
this.visualization = new BasicVisualizationServer<Node, Edge>(
this.layout);
this.visualization.setPreferredSize(new Dimension(350, 350));
this.frame = new JFrame("MOC View");
this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.frame.getContentPane().add(this.visualization);
this.frame.pack();
this.frame.setVisible(true);
}
@Override
public void updateGraph() {
this.visualization.repaint();
}
}
該模型
public class MOCModel implements MOCModelInterface {
private final Graph<Node, Edge> graph = new DirectedSparseGraph<Node, Edge>();
private final ArrayList<GraphChangeObserver> graphChangeObservers = new ArrayList<GraphChangeObserver>();
@Override
public void initialize() {
this.generateInitialGraph();
}
@Override
public Graph<Node, Edge> getGraph() {
return this.graph;
}
@Override
public void registerObserver(final GraphChangeObserver o) {
this.graphChangeObservers.add(o);
}
@Override
public void removeObserver(final GraphChangeObserver o) {
this.graphChangeObservers.remove(o);
}
private void generateInitialGraph() {
final Node nodeA = new Node("Node A");
this.graph.addVertex(nodeA);
final Node nodeB = new Node("Node B");
this.graph.addVertex(nodeB);
final Node nodeC = new Node("Node C");
this.graph.addVertex(nodeC);
final Node nodeD = new Node("Node D");
this.graph.addVertex(nodeD);
final Node nodeE = new Node("Node E");
this.graph.addVertex(nodeE);
this.graph.addEdge(new Edge("Edge 1"), nodeA, nodeB);
this.graph.addEdge(new Edge("Edge 2"), nodeA, nodeC);
this.graph.addEdge(new Edge("Edge 3"), nodeB, nodeC);
this.graph.addEdge(new Edge("Edge 4"), nodeC, nodeD);
this.graph.addEdge(new Edge("Edge 5"), nodeD, nodeE);
this.graph.addEdge(new Edge("Edge 6"), nodeA, nodeE);
this.graph.addEdge(new Edge("Edge 7"), nodeE, nodeA);
this.graph.addEdge(new Edge("Edge 8"), nodeD, nodeB);
notifyGraphChangeObservers();
}
private void notifyGraphChangeObservers() {
for (final GraphChangeObserver gco : this.graphChangeObservers) {
gco.updateGraph();
}
}
}
控制器
public class MOCController implements ControllerInterface {
private final MOCModelInterface model;
private final MOCView view;
public MOCController(final MOCModelInterface model) {
this.model = model;
this.view = new MOCView(this, model);
this.view.createView();
this.model.initialize();
}
}
主班
public class MOCStart {
/**
* @param args
*/
public static void main(final String[] args) {
final MOCModelInterface model = new MOCModel();
new MOCController(model);
}
}
了解JUNG2工作原理的最佳方法是使用Maven svn checkout http://jung.googlecode.com/svn/trunk/ jung-read-only
通過m2e Maven Eclipse插件從SVN存儲庫中查看其樣本, svn checkout http://jung.googlecode.com/svn/trunk/ jung-read-only
//jung.googlecode.com/svn/trunk/ svn checkout http://jung.googlecode.com/svn/trunk/ jung-read-only
從此處,檢查edu.uci.ics.jung.samples包, 以獲取涉及圖形鼠標的各種JUNG2代碼示例:例如GraphEditorDemo.java
注意 :請應用以下SVN補丁來更正一些錯誤
### Eclipse Workspace Patch 1.0
#P jung-io
Index: src/test/java/edu/uci/ics/jung/io/TestGraphMLReader.java
===================================================================
--- src/test/java/edu/uci/ics/jung/io/TestGraphMLReader.java (revision 31)
+++ src/test/java/edu/uci/ics/jung/io/TestGraphMLReader.java (working copy)
@@ -125,7 +125,7 @@
public void testAttributes() throws IOException
{
Graph<Number, Number> graph = new UndirectedSparseGraph<Number, Number>();
- gmlreader.load("src/test/resources/attributes.graphml", graph);
+ gmlreader.load("src/test/resources/edu/uci/ics/jung/io/graphml/attributes.graphml", graph);
Assert.assertEquals(graph.getVertexCount(), 6);
Assert.assertEquals(graph.getEdgeCount(), 7);
@@ -193,7 +193,7 @@
GraphMLReader<Hypergraph<Number, Number>, Number, Number> hyperreader =
new GraphMLReader<Hypergraph<Number, Number>, Number, Number>(
vertexFactory, edgeFactory);
- hyperreader.load("src/test/resources/hyper.graphml", graph);
+ hyperreader.load("src/test/resources/edu/uci/ics/jung/io/graphml/hyper.graphml", graph);
Assert.assertEquals(graph.getVertexCount(), 7);
Assert.assertEquals(graph.getEdgeCount(), 4);
### Eclipse Workspace Patch 1.0
#P jung2
Index: jung-visualization/src/main/java/edu/uci/ics/jung/visualization/control/EditingPopupGraphMousePlugin.java
===================================================================
--- jung-visualization/src/main/java/edu/uci/ics/jung/visualization/control/EditingPopupGraphMousePlugin.java (revision 31)
+++ jung-visualization/src/main/java/edu/uci/ics/jung/visualization/control/EditingPopupGraphMousePlugin.java (working copy)
@@ -54,6 +54,8 @@
final PickedState<V> pickedVertexState = vv.getPickedVertexState();
final PickedState<E> pickedEdgeState = vv.getPickedEdgeState();
+ popup.removeAll();
+
if(vertex != null) {
Set<V> picked = pickedVertexState.getPicked();
if(picked.size() > 0) {
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.