如何在 graphstream 中使用静态布局
how to use static layout in graphstream
我想使用 GraphStream 生成静态图。有什么建议的解决方案吗?
我从 DGS 文件(从其他模型生成)读取输入数据。因为节点的数量不是每次都固定的,我不想手动指定每个节点的每个位置。目前我可以使用autolayout功能来放置节点,结果还可以,但问题是:如果单击节点并拖动它,每个节点都可以移动。有什么方法可以使用自动布局生成图形,同时节点不可拖动?
提前致谢!
为了防止用户与默认查看器交互,您需要在默认 View
中指定一个新的 MouseManager
,它实际上什么都不做。
因为你不能设置 null
MouseManager
(它会产生默认的),你需要创建一个基本上什么都不做的新 class 并将它交给 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 回答的启发,但这是一种更好的工作方式。如果你只是想严格一些鼠标activity,你可以这样做:
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 事件后编写自己的代码。您甚至可以创建自己的 Class 扩展 DefaultMouseManaer 并覆盖您想要的功能并将该对象设置为鼠标管理器,这将是更清晰的编程方式。
我想使用 GraphStream 生成静态图。有什么建议的解决方案吗?
我从 DGS 文件(从其他模型生成)读取输入数据。因为节点的数量不是每次都固定的,我不想手动指定每个节点的每个位置。目前我可以使用autolayout功能来放置节点,结果还可以,但问题是:如果单击节点并拖动它,每个节点都可以移动。有什么方法可以使用自动布局生成图形,同时节点不可拖动?
提前致谢!
为了防止用户与默认查看器交互,您需要在默认 View
中指定一个新的 MouseManager
,它实际上什么都不做。
因为你不能设置 null
MouseManager
(它会产生默认的),你需要创建一个基本上什么都不做的新 class 并将它交给 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 回答的启发,但这是一种更好的工作方式。如果你只是想严格一些鼠标activity,你可以这样做:
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 事件后编写自己的代码。您甚至可以创建自己的 Class 扩展 DefaultMouseManaer 并覆盖您想要的功能并将该对象设置为鼠标管理器,这将是更清晰的编程方式。