覆盖 graphstream 的 DefaultMouseManager

override graphstream's DefaultMouseManager

我正在使用 GraphStream 来显示一个区域的地图,我尝试继承默认的 MouseManager DefaultMouseManager 并覆盖 mouseClicked 方法,以便在单击节点时将发生以下情况:

  1. 节点的颜色会改变。
  2. 节点的标签将显示。
  3. 节点的数据将显示在终端中。

我知道该方法有效,因为节点的数据确实打印到终端,但我认为其他一些鼠标事件会重新绘制节点并重新隐藏标签,以便在单击节点时它们不会更改。

这是我的 MouseManager 代码:

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;
    }
}

我试图检查在我的 mouseClicked 被调用后调用了基础 class DefaultMouseManager 中的哪些方法,因此我也可以覆盖它们,但是有很多他们跟随。

是否有一种优雅的方法来确保我的更改将在基础 class 的所有其他方法之后执行?

Is there an elegant way to make sure my changes will execute after all other method from the base class?

阅读文档并查看 DefaultMouseManager. I googled DefaultMouseManager, looked at the documentation, went through the inheritance of the different interfaces until I got to MouseListener 中的代码,其中描述了操作顺序。然后我查看了 mouseClicked 和 mouseReleased,因为它们最后会被调用,mouseClicked 是空的,因此留下 mouseReleased 和其中调用的方法。

所以,类似的事情发生了,mouseClicked()方法被调用了两次。

在我的代码中,我将前一个节点重新涂黑并在单击新节点后隐藏其标签。出于这个原因,当 mouseClicked() 方法被调用两次时,第一次调用改变了节点的外观,第二次调用又把它改回来了。

在这种情况下,一个简单的解决方法是检查前一个节点和当前节点是否相同。将此 if(focusedNode!= null) 替换为此

if(focusedNode!= null && focusedNode != currentNode)

但更直接的解决方案是了解为什么该方法被调用两次。
我的猜测是它与继承有关,但我不确定。