В соответствии с вашим текущим дизайном, вам просто нужно проверить, нажата ли мышь внутри дочернего элемента и является ли этот дочерний элемент экземпляром Rectangle
; тогда вы можете разыграть и позвонить setFill
. Однако я рекомендую изменить имя changeColor
, поскольку это имя не отражает действия этого метода.
public void installChangeColorHandler(Pane pane) {
pane.setOnMouseClicked(event -> {
for (Node child : pane.getChildren()) {
if (child instanceof Rectangle
&& child.contains(child.parentToLocal(event.getX(), event.getY()))) {
((Rectangle) child).setFill(/* YOUR COLOR */);
event.consume();
break;
}
}
});
}
Поскольку обработчик событий добавляется к Pane
, координаты мыши x
и y
относятся к указанному Pane
. Но поскольку ваши Rectangle
s являются прямыми потомками Pane
, мы можем вызвать Node.parentToLocal
, чтобы преобразовать эти координаты в пространство Rectangle
1 . Затем нам нужно проверить, содержат ли границы Rectangle
эти координаты, используя Node.contains
; если это так, измените заливку.
Тем не менее, вы можете изменить свой код так, чтобы вы добавляли / 1021 * непосредственно к Rectangle
s. Таким образом, вы можете использовать Event.getSource()
. Например, 2 :
public Pane render(EventHandler<MouseEvent> onClick) {
// outer loop...
// inner loop...
Rectangle r = new Rectangle();
// configure r...
r.setOnMouseClicked(onClick);
// end inner loop...
// end outer loop...
}
...
// may want to consume event
Pane window = new Grid(30, 30, 30).render(event ->
((Rectangle) event.getSource()).setFill(/* YOUR COLOR */));
1. Даже если они не были прямыми детьми, вы все равно можете преобразовать координаты в локальное пространство. Например, вы можете использовать Node.sceneToLocal
и координаты сцены, предоставленные MouseEvent
(т.е. getSceneX()
/ getSceneY()
).
2. Это все еще близко к вашему дизайну. Однако вы можете переосмыслить вещи в правильную архитектуру MVC (или другую). Применение MVC с JavaFx