Как использовать статическую разметку в Graphstream
Я хотел бы генерировать статический график с использованием GraphStream. Есть ли какие-то предложения решения?
Я читаю входные данные из файла DGS (сгенерированного из другой модели). Потому что количество узлов не всегда фиксировано, и я не хочу вручную указывать каждую позицию каждого узла. В настоящее время я могу использовать функцию autolayout для размещения узлов, и результат в порядке, но проблема в том, что каждый узел можно переместить, если щелкнуть узел и перетащить его. Есть ли способ для генерации графа с использованием автоматического размещения, и узел не может быть перетаскиваем в одно и то же время?
Заранее спасибо!
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() {}
});
Это вдохновлено ответом @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 и переопределить функцию, которую вы хотите, и установить этот объект в диспетчер мыши, это будет более понятным способом программирования.