如何在MVC-gui中使用JUNG2? [英] How do I use JUNG2 in a MVC-gui?

查看:104
本文介绍了如何在MVC-gui中使用JUNG2?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在玩JUNG2,并想实现一个小的GUI,该GUI允许我显示和更改Graph.遵循JUNG库中的示例可以很好地工作,但是它们没有将Model,View和Controller分开.因此,我开始以清晰的分离来构建GUI.

I was playing around with JUNG2 and wanted to implement a small GUI that allows me to display and change a Graph. Following the examples from the JUNG library worked fine, but they don't separate Model, View and Controller. So I started to build GUI with a clean separation.

我的第一个GUI版本应该只是显示初始图形.该视图是模型的观察者,并且只要图形发生更改,该通知就会在图形的初始化步骤中发生一次,该通知恰好发生一次.但是,该图并没有显示在屏幕的中央(就像在非MVC示例中一样),但是我可以在左上角看到其中的一小部分.

My first version of a GUI is supposed, to simply show an initial graph. The view is an observer of the model and gets notifications, whenever the graph changes, which happens exactly one time, at the initialization step of the graph. However, the graph isn't displayed in the center of the screen, (as it was in the non-MVC example), but I can see a small part of it in the upper-left corner.

现在,这引出了一个普遍的问题:我如何告诉jung可视化组件模型已更改?以及以后的内容:如何使用现成的组件,例如MVC体系结构中的Jung-Mouse? JUNG似乎将模型,视图和控制器混合在一起,我不确定如何以及在何处正确使用它们.

Now, this leads to the general question: How do I tell the jung-visualization components, that the model changed? And for later: How do I use ready-to-use components, like the Jung-Mouse in a MVC-Architecture? JUNG seems to have mixed model, view and controller and I'm not sure, how and where to use them properly.

编辑:"Jung教程"显示了如何使用鼠标来管理更改,但未显示如何根据模型中的更改来更改视图(通过其他选项,例如按钮添加节点"或其他内容

The Jung Tutorial shows how to manage changes by using the mouse, but it doesn't show, how to change the view based on changes in the model (through other options, e.g. a button "add node" or something else)

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

Here is my first try so far:

视图

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如何工作的最佳方法是通过M2e Maven Eclipse插件使用Maven svn checkout http://jung.googlecode.com/svn/trunk/ jung-read-only从SVN存储库中查看其样本

The best way to learn how JUNG2 works is to look at its samples from SVN repository using Maven svn checkout http://jung.googlecode.com/svn/trunk/ jung-read-only via m2e Maven Eclipse plugin

从此处,检查软件包 edu.uci.ics.jung.samples ,以获取涉及图形鼠标的各种JUNG2代码示例:例如GraphEditorDemo.java

From here, check the package edu.uci.ics.jung.samples for various JUNG2 code samples involving graph mouse: e.g. GraphEditorDemo.java

注意:应用下面的SVN补丁来纠正一些错误

Note: Apply the SVN patches below to correct a few bugs

### 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) {

这篇关于如何在MVC-gui中使用JUNG2?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆