여기 당신이 gridpane에 아닌 세포의 노드에서만 마우스 수신기를 원하는 경우에 당신이 그것을 할 수있는 방법에 대한 예입니다. 간단히하기 위해 셀 노드로 레이블을 사용했지만 원하는대로 사용할 수 있습니다.
public class Demo extends Application {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(final Stage primaryStage) {
Pane root = new Pane();
GridPane gridPane = new GridPane();
gridPane.setGridLinesVisible(true);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
Label label = new Label("Label " + i + "/" + j);
label.setMouseTransparent(true);
GridPane.setRowIndex(label, i);
GridPane.setColumnIndex(label, j);
gridPane.getChildren().add(label);
}
}
root.getChildren().add(gridPane);
Scene scene = new Scene(root, 400, 300, Color.WHITE);
primaryStage.setScene(scene);
primaryStage.show();
gridPane.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
for(Node node: gridPane.getChildren()) {
if(node instanceof Label) {
if(node.getBoundsInParent().contains(e.getSceneX(), e.getSceneY())) {
System.out.println("Node: " + node + " at " + GridPane.getRowIndex(node) + "/" + GridPane.getColumnIndex(node));
}
}
}
}
});
}
}
클릭 된 셀 정보가 콘솔에 표시됩니다.
당신은 람다 식으로 여기 대신 gridpane의 셀 노드에 리스너를 넣어 줄 경우 동일한 작동합니다 :
label.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> System.out.println("Node: " + label + " at " + GridPane.getRowIndex(label) + "/" + GridPane.getColumnIndex(label)));
그러나 getRowIndex 및 getColumnIndex 방법 만있는 경우 작동하는지 알고 있어야 이러한 방법에 대한 문서에 지정된대로 데이터가 이전에 설정되었습니다.
나는 당신이 성취하고자하는 것에 대한 정보가 없지만, 개인적으로 나는 바뀔지도 모르는 레이아웃 관리자의 일부 색인 대신에 노드 자체로 작업하는 것을 선호합니다.
와우! 완전한! 고마워요! :) –