私は JUNG2 をいじっていて、グラフを表示および変更できる小さな GUI を実装したいと考えていました。JUNG ライブラリの例に従うことはうまくいきましたが、モデル、ビュー、およびコントローラーを分離していません。そこで、きれいに分離して GUI を構築し始めました。
私の最初のバージョンの GUI は、単純に初期グラフを表示するためのものです。ビューはモデルのオブザーバーであり、グラフが変更されるたびに通知を受け取ります。これは、グラフの初期化ステップで 1 回だけ発生します。ただし、グラフは画面の中央には表示されませんが (非 MVC の例のように)、左上隅にグラフの一部が表示されます。
さて、これは一般的な質問につながります: モデルが変更されたことをユング視覚化コンポーネントにどのように伝えることができますか? そして後で: 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);
}
}