Я использую GraphStream, чтобы показать карту области, и я попытался наследовать от MouseManager DefaultMouseManager по умолчанию и переопределить метод mouseClicked
, чтобы при нажатии на узел происходило следующее:
Я знаю, что этот метод работает, потому что данные узла печатаются на терминале, но я думаю, что какое-то другое событие мыши перерисовывает узел и повторно скрывает метку, чтобы они не менялись при нажатии на узел.
вот мой код 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
, чтобы я мог их переопределить, но многим из них нужно было следовать.
Есть ли элегантный способ убедиться, что мои изменения будут выполняться после всех других методов из базового класса?
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 и методы, которые в нем вызываются.
То, как я прочитал код, заключается в том, что mouseReleased вызывает кучу других методов (как я упоминал в своем ответе), методы из DefaultView, вероятно, являются частью этой цепочки. Я бы просто @override mouseReleased, скопировал те части из DefaultMouseManager, которые вам нужны, и добавил свой пользовательский метод, чтобы делать то, что вы хотите, в конце, посмотрите, к чему это приведет.
Итак, произошло что-то похожее на этот вопрос, дважды вызывался метод mouseClicked()
.
В моем коде я перекрашиваю в черный цвет предыдущий узел и скрываю его метку после нажатия на новый узел. И по этой причине, когда метод mouseClicked()
был вызван дважды, то первый вызов изменил внешний вид узла, а второй вернул его обратно.
В этом случае простым решением будет проверить, совпадают ли предыдущий узел и текущий узел. замените это if (focusedNode!= null)
на это
if (focusedNode!= null && focusedNode != currentNode)
но более простым решением будет понять, почему метод вызывается дважды. Я предполагаю, что это как-то связано с наследством, но я не уверен.
Я посмотрел там, но есть много других методов, которые вызываются после mouseRelesed и mouseClicked. например методы из класса Вид по умолчанию