Как использовать статическую разметку в Graphstream

Я хотел бы генерировать статический график с использованием GraphStream. Есть ли какие-то предложения решения?

Я читаю входные данные из файла DGS (сгенерированного из другой модели). Потому что количество узлов не всегда фиксировано, и я не хочу вручную указывать каждую позицию каждого узла. В настоящее время я могу использовать функцию autolayout для размещения узлов, и результат в порядке, но проблема в том, что каждый узел можно переместить, если щелкнуть узел и перетащить его. Есть ли способ для генерации графа с использованием автоматического размещения, и узел не может быть перетаскиваем в одно и то же время?

Заранее спасибо!

2 ответа

Решение

Чтобы предотвратить взаимодействие пользователя со средством просмотра по умолчанию, необходимо указать новый MouseManagerпо умолчанию View, что на самом деле ничего не делает.

Поскольку вы не можете установить nullMouseManager (он будет порождать класс по умолчанию), вам нужно создать новый класс, который в основном ничего не делает, и передать его 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() {}
    });

Это вдохновлено ответом @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 и переопределить функцию, которую вы хотите, и установить этот объект в диспетчер мыши, это будет более понятным способом программирования.

Другие вопросы по тегам