【问题标题】:how to use static layout in graphstream如何在graphstream中使用静态布局
【发布时间】:2015-04-12 01:14:49
【问题描述】:

我想使用 GraphStream 生成静态图。有什么建议解决方案吗?

我从 DGS 文件(从其他模型生成)读取输入数据。因为节点的数量不是每次都固定的,我不想手动指定每个节点的每个位置。目前我可以使用自动布局功能来放置节点,结果还可以,但问题是:每个节点都可以通过点击节点并拖动来移动。有没有办法使用自动布局生成图,同时节点不可拖动?

提前致谢!

【问题讨论】:

    标签: java graph static graphstream


    【解决方案1】:

    为了防止用户与默认查看器进行交互,您需要在默认View 中指定一个新的MouseManager,它实际上什么都不做。

    由于您无法设置null MouseManager(它会生成默认的),因此您需要创建一个基本上什么都不做的新类并将其提供给View

    一种肮脏的做法:

    graph.display()
        .getDefaultView()
        .setMouseManager(new MouseManager(){
            @Override
            public void mouseClicked(MouseEvent e) {}
            @Override
            public void mousePressed(MouseEvent e) {}
            @Override
            public void mouseReleased(MouseEvent e) {}
            @Override
            public void mouseEntered(MouseEvent e) {}
            @Override
            public void mouseExited(MouseEvent e) {}
            @Override
            public void mouseDragged(MouseEvent e) {}
            @Override
            public void mouseMoved(MouseEvent e) {}
            @Override
            public void init(GraphicGraph graph, View view) {}
            @Override
            public void release() {}
        });
    

    【讨论】:

    • 感谢您的回复。我想我有一些线索可以解决它!
    • 对了,你能看看我关于GS的另一个问题吗?当然如果你有时间:stackoverflow.com/questions/28478936/…
    • 喜欢你的想法 +1
    【解决方案2】:

    这是受@Yoann 回答的启发,但它是一种更好的工作方式。如果您只是想限制一些鼠标活动,您可以执行以下操作:

    ViewPanel viewPanel = graph.display().getDefaultView();
    MouseManager manager = new DefaultMouseManager() {
    
        @Override
        public void mouseDragged(MouseEvent event) {
    
        }
    
        @Override
        protected void mouseButtonPress(MouseEvent event) {
            super.mouseButtonPress(event);
    
            System.out.println("Press");
        }
    
        @Override
        public void mouseClicked(MouseEvent event) {
            super.mouseClicked(event);
            System.out.println("Clicked");
        }
    
        @Override
        public void mousePressed(MouseEvent event) {
            super.mousePressed(event);
    
            // if you need object of Node pressed, following code will help you, curElement is already defined at DefaultMouseManager.
            curElement = view.findNodeOrSpriteAt(event.getX(), event.getY());
    
            if (curElement != null) {
                Node node = graph.getNode(curElement.getId());
                if(node != null) {
                    System.out.println("Mouse pressed at node: " + node.getId());
                }
            }
    
        }
    
    };
    
    viewPanel.setMouseManager(manager);
    

    在这里,我禁用了 mouseDragged,并在执行默认的 mouseButtonPress、mouseClicked 和 mousePressed 事件后编写自己的代码。您甚至可以创建自己的类来扩展 DefaultMouseManaer 并覆盖您想要的功能并将该对象设置为鼠标管理器,这将是一种更清晰的编程方式。

    【讨论】:

      猜你喜欢
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 2023-04-09
      • 2013-04-17
      相关资源
      最近更新 更多