首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MVC中使用JUNG2?

如何在MVC中使用JUNG2?
EN

Stack Overflow用户
提问于 2011-11-22 12:14:25
回答 1查看 705关注 0票数 2

我在玩JUNG2,想要实现一个小的GUI,它允许我显示和更改一个图形。遵循JUNG库中的示例可以很好地工作,但它们不分离模型、视图和控制器。所以我开始用一个清晰的分离来构建GUI。

我的第一个版本的GUI应该是简单地显示一个初始图形。视图是模型的观察者,每当图形发生变化时,都会在图的初始化步骤中获得通知,这恰好发生了一次。然而,图形并没有显示在屏幕的中心(就像在非MVC示例中那样),但是我可以在左上角看到其中的一小部分。

现在,这引出了一个普遍的问题:我如何告诉jung-可视化组件,模型发生了变化?接下来:我如何使用现成的组件,比如MVC体系结构中的Jung-老鼠?JUNG似乎有混合的模型,视图和控制器,我不知道如何和在哪里正确地使用它们。

编辑: Jung教程展示了如何使用鼠标管理更改,但它没有显示如何根据模型中的更改更改视图(通过其他选项,例如“添加节点”按钮或其他选项)

到目前为止,这是我第一次尝试:

视图

代码语言:javascript
复制
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();
}
}

模型

代码语言:javascript
复制
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();
    }
}
}

控制器

代码语言:javascript
复制
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();
}
}

主类

代码语言:javascript
复制
public class MOCStart {

/**
 * @param args
 */
public static void main(final String[] args) {
    final MOCModelInterface model = new MOCModel();
    new MOCController(model);
}

}
EN

回答 1

Stack Overflow用户

发布于 2011-11-22 15:34:55

了解JUNG2如何工作的最佳方法是使用Maven svn checkout http://jung.googlecode.com/svn/trunk/ jung-read-only通过m2e Maven Eclipse插件查看SVN存储库中的示例

从这里开始,查看包edu.uci.ics.jung.samples,查看涉及图形鼠标的各种JUNG2代码示例:例如,GraphEditorDemo.java

注意事项:应用下面的SVN修补程序来纠正一些bug

代码语言:javascript
复制
### 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) {
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8226624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档