как использовать статическую компоновку в графстриме

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

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

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


person Bing    schedule 11.02.2015    source источник


Ответы (2)


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

Поскольку вы не можете установить 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() {}
    });
person Yoann    schedule 12.02.2015
comment
Спасибо за ваш ответ. Я думаю, у меня есть ключ, чтобы исправить это! - person Bing; 12.02.2015
comment
Кстати, не могли бы вы взглянуть на мой еще один вопрос о GS? Конечно, если у вас есть время: stackoverflow.com /вопросы/28478936/ - person Bing; 12.02.2015
comment
Понравилась ваша идея +1 - person Vishrant; 30.10.2017

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

person Vishrant    schedule 30.10.2017