How to draw graph inside swing with GraphStream actually?

I am trying to implement drawing of tutorial graph inside swing, but failing.

The code is follows:

package tests.graphstream;

import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.SwingUtilities; import org.graphstream.graph.Graph; import org.graphstream.graph.implementations.SingleGraph; import org.graphstream.ui.swingViewer.View; import org.graphstream.ui.swingViewer.Viewer; public class Tutorial1_01 { private static Graph graph = new SingleGraph("Tutorial 1"); public static class MyFrame extends JFrame { private static final long serialVersionUID = 8394236698316485656L; //private Graph graph = new MultiGraph("embedded"); //private Viewer viewer = new Viewer(graph, Viewer.ThreadingModel.GRAPH_IN_ANOTHER_THREAD); private Viewer viewer = new Viewer(graph, Viewer.ThreadingModel.GRAPH_IN_SWING_THREAD); private View view = viewer.addDefaultView(false); public MyFrame() { setLayout(new BorderLayout()); add(view, BorderLayout.CENTER); setDefaultCloseOperation(EXIT_ON_CLOSE); } } public static void main(String args[]) { SwingUtilities.invokeLater(new Runnable() { public void run() { MyFrame frame = new MyFrame(); frame.setSize(320, 240); frame.setLocationRelativeTo(null); frame.setVisible(true); graph.addNode("A"); graph.addNode("B"); graph.addNode("C"); graph.addEdge("AB", "A", "B"); graph.addEdge("BC", "B", "C"); graph.addEdge("CA", "C", "A"); graph.addAttribute("ui.quality"); graph.addAttribute("ui.antialias"); } }); } }

And it draws this:

<img src="https://i.stack.imgur.com/meXrf.png" alt="enter image description here">

If drag nodes, it turns to:

<img src="https://i.stack.imgur.com/mfvt8.png" alt="enter image description here">

How to get results, close to graph.display()?

Answer1:

This is a side effect due to the fact that nodes do not have x and y coordinates by default.

To prevent this you should whether :

    <li>activate the autolayout on your viewer object with viewer.enableAutoLayout();</li> <li>or specify by yourself some xand y attributes for each node.</li> </ul>

    With Autolayout

    // ... public MyFrame() { setLayout(new BorderLayout()); add(view, BorderLayout.CENTER); setDefaultCloseOperation(EXIT_ON_CLOSE); // Activate autolayout here : viewer.enableAutoLayout(); } // ...

    With nodes attributes

    // In main() ... Node a = graph.addNode("A"); a.addAttribute("xy", 0, 0); Node b = graph.addNode("B"); b.addAttribute("xy", 10, 0); Node c = graph.addNode("C"); c.addAttribute("xy", 10, 10); // ...

    人吐槽 人点赞

Recommend

Comment

用户名: 密码:
验证码: 匿名发表

你可以使用这些语言

查看评论:How to draw graph inside swing with GraphStream actually?