Переопределить 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;
    }
}

Я пытался проверить, какие методы из базового класса DefaultMouseManager вызываются после вызова моего mouseClicked, чтобы я мог их переопределить, но многим из них нужно было следовать.

Есть ли элегантный способ убедиться, что мои изменения будут выполняться после всех других методов из базового класса?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
24
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Прочтите документацию и посмотрите код в DefaultMouseManager. Я погуглил DefaultMouseManager, посмотрел документацию, прошелся по наследованию разных интерфейсов, пока не добрался до MouseListener, описывающего порядок операций. Затем я посмотрел на mouseClicked и mouseReleased, так как они будут вызываться последними, mouseClicked пуст, поэтому остается mouseReleased и методы, которые в нем вызываются.

Я посмотрел там, но есть много других методов, которые вызываются после mouseRelesed и mouseClicked. например методы из класса Вид по умолчанию

Kfir Ettinger 12.05.2022 11:06

То, как я прочитал код, заключается в том, что mouseReleased вызывает кучу других методов (как я упоминал в своем ответе), методы из DefaultView, вероятно, являются частью этой цепочки. Я бы просто @override mouseReleased, скопировал те части из DefaultMouseManager, которые вам нужны, и добавил свой пользовательский метод, чтобы делать то, что вы хотите, в конце, посмотрите, к чему это приведет.

Don Pauer 13.05.2022 17:15
Ответ принят как подходящий

Итак, произошло что-то похожее на этот вопрос, дважды вызывался метод mouseClicked().

В моем коде я перекрашиваю в черный цвет предыдущий узел и скрываю его метку после нажатия на новый узел. И по этой причине, когда метод mouseClicked() был вызван дважды, то первый вызов изменил внешний вид узла, а второй вернул его обратно.

В этом случае простым решением будет проверить, совпадают ли предыдущий узел и текущий узел. замените это if (focusedNode!= null) на это

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

но более простым решением будет понять, почему метод вызывается дважды. Я предполагаю, что это как-то связано с наследством, но я не уверен.

Другие вопросы по теме