2

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

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

提前致谢!

4

2 回答 2

3

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

由于您无法设置 a 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() {}
    });
于 2015-02-12T14:40:57.280 回答
1

这是受@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 并覆盖您想要的功能并将该对象设置为鼠标管理器,这将是一种更清晰的编程方式。

于 2017-10-30T02:58:37.143 回答