我使用GraphStream显示一个区域的地图,并尝试从默认的MouseManager DefaultMouseManager继承并覆盖mouseClicked方法,以便在单击节点时会发生以下情况:
我确实知道该方法有效,因为该节点的数据确实被打印到终端上,但我认为其他一些鼠标事件会重新绘制节点并重新隐藏标签,这样在单击节点时它们就不会改变。
这是我的鼠标管理员代码:
public class CustomMouseManager2 extends DefaultMouseManager {
protected View view;
protected GraphicGraph graph;
private GraphicElement focusedNode;
@Override
public void init(GraphicGraph graph, View view) {
super.init(graph, view);
.
.
.
}
@Override
public void mouseClicked(MouseEvent e) {
GraphicElement currentNode = view.findNodeOrSpriteAt(e.getX(), e.getY());
if(currentNode != null){
OGraph graph = OGraph.getInstance();
Random r = new Random();
currentNode.setAttribute("ui.style", "fill-color: red; text-mode: normal;");
ONode oNode = graph.getNode(Long.parseLong(currentNode.getLabel()));
System.out.println(oNode.toString());
}
if(focusedNode!= null)
focusedNode.setAttribute("ui.style", "fill-color: black;size: 10px, 10px; text-mode: hidden;");
focusedNode = currentNode;
}
}在调用我的DefaultMouseManager之后,我尝试检查基类mouseClicked中的哪些方法被调用,这样我也可以重写它们,但是很多方法都需要遵循。
是否有一种优雅的方法来确保在基类中的所有其他方法之后执行我的更改?
发布于 2022-05-12 09:37:09
因此,类似于这个问题的事情发生了,mouseClicked()方法被调用了两次。
在我的代码中,我将前一个节点重新绘制为黑色,并在单击一个新节点后隐藏它的标签。因此,当mouseClicked()方法被调用两次时,第一次调用改变了节点的外观,第二次调用改变了节点的外观。
在这种情况下,一个简单的修复方法是检查前一个节点和当前节点是否相同。将此if(focusedNode!= null)替换为
if(focusedNode!= null && focusedNode != currentNode)但是一个更简单的解决方案将是理解为什么这个方法会被两次调用。
我的猜测是,这与继承有关,但我不确定。
发布于 2022-05-11 18:46:03
是否有一种优雅的方法来确保在基类中的所有其他方法之后执行我的更改?
阅读文档并查看DefaultMouseManager中的代码。我在googled上搜索了DefaultMouseManager,查看了文档,遍历了不同接口的继承,直到我找到了描述操作顺序的MouseListener。然后我看了一下mouseClicked和mouseReleased,因为它们最后会被调用,mouseClicked是空的,所以会留下mouseReleased和其中调用的方法。
https://stackoverflow.com/questions/72205266
复制相似问题