当前位置: 首页 > 知识库问答 >
问题:

实际上,如何使用GraphStream在摆动中绘制图形?

习狐若
2023-03-14

我试图在swing中实现教学图的绘制,但是失败了。

代码如下:

包测试.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");
            }
        });
    }
}

它画出了这个:

如果拖动节点,它将变为:

如何获得结果,接近graph.display()

共有1个答案

印劲
2023-03-14

这是一个副作用,因为默认情况下节点没有xy坐标。

为了防止这种情况,您应该:

  • 使用查看器在浏览器对象上激活自动布局。enableAutoLayout()
  • 或者为每个节点指定一些xy
// ...
public MyFrame() {
     setLayout(new BorderLayout());
     add(view, BorderLayout.CENTER);
     setDefaultCloseOperation(EXIT_ON_CLOSE);
     // Activate autolayout here : 
     viewer.enableAutoLayout();
}
// ...
// 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);
// ...

 类似资料:
  • 我该怎么做才能在我自己的视图上使用freehanf手指画?

  • 我的Android应用程序允许用户打开图像,在特定区域创建标记(视觉线索),他们可以分别添加注释和在团队中交换。 例如。为了最终确定建筑计划,该应用程序允许以位图的形式打开拟议的计划,管理层可以通过在特定部分上标记并添加相应的注释来建议修改。 要求是,用户应该得到一个选择,以选择一个模式绘制在他的手指移动。 Android为绘制模式提供了哪些选项? 我想用手指触摸上面的图案之一。

  • 我有一些节点来自一个脚本,我想将它们映射到图表上。在下面,我想使用Arrow从A到D,并且可能将边缘也着色(红色或其他东西)。 当所有其他节点都存在时,这基本上就像从A到D的路径。您可以将每个节点想象为城市,从A到D需要方向(带有箭头)。 下面的代码构建了图形 第一图像的箭头和第二图像上的红色边缘。

  • 我只是试图用DrawOval()方法画圆,当我运行程序时,它只显示小正方形。我试图将构造函数添加到Surface类,但它不起作用。这是我制作的代码:

  • 问题内容: 我必须使用pdfbox绘制一个饼图。 令数据为: 主题分数百分比累计分数 Sub-1 80 80 80 Sub-2 70 70150 Sub-3 65 65215 Sub-4 90 90305 Sub-5 55 55360 令半径和中心为100像素和(250,400)。 让我们取平行于x轴的初始线。 绘图的初始线条语句将为: contentStream.drawLine(250,400

  • 我必须用pdfbox绘制一个饼图。 让数据是: 设半径和中心为100像素和(250,400)。 让我们取平行于x轴的初始线 绘制初始行语句将为: contentStream。抽绳(250400350400); 我坚持: a)在距离初始线一定程度的圆圈上找到点的x, y坐标,以绘制半径 b)使用贝塞尔曲线在两点之间绘制圆弧。 任何帮助解决问题将不胜感激!