JavaFX:如何在gridpane中获取列和行索引?

JavaFX:如何在gridpane中获取列和行索引?,javafx,Javafx,单击时,我试图获取gridpane的行/列索引 我正在寻找类似JTable(JavaSwing)中的方法 我搜索了这个 但这对我没有帮助。因为它需要节点名称来获取行/列索引 我制作了一个语法网格组件。所以节点名是相同的。 我怎样才能得到这个值?我的部分代码如下 for (int i = 0; i < imageName.length; i++) { try { img = new Image(getClass().getResourceAsStream(imageName

单击时,我试图获取gridpane的行/列索引

我正在寻找类似JTable(JavaSwing)中的方法

我搜索了这个

但这对我没有帮助。因为它需要节点名称来获取行/列索引

我制作了一个语法网格组件。所以节点名是相同的。 我怎样才能得到这个值?我的部分代码如下

for (int i = 0; i < imageName.length; i++) {
   try {
      img = new Image(getClass().getResourceAsStream(imageName[i]));   
   } catch (Exception e) {
      System.out.println("exception : " + e);
   }
      ImageView imageview = new ImageView(img);
      imageview.setFitWidth(40);
      imageview.setFitHeight(40);

      HBox hbox= new HBox();
      hbox.getChildren().add(imageview);
      tile1.setHgap(40);
      tile1.setVgap(40);
      tile1.add(hbox, i+2, 0);
}
for(int i=0;i
下面是一个示例,说明如果您只想在网格窗格上使用鼠标侦听器,而不想在单元格中的节点上使用鼠标侦听器,您可以如何执行此操作。为了简单起见,我使用了一个标签作为单元节点,但您可以使用任何您喜欢的

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

    }

}
但是请注意,只有在数据之前已设置的情况下(如这些方法的文档中所指定),和方法才起作用


我不知道您打算实现什么,但就个人而言,我更喜欢使用节点本身,而不是布局管理器中可能发生变化的一些索引。

正如@Roland指出的,您还可以为每个节点分配一个侦听器。执行此操作时,您可以使用此方法的单个回调方法(例如,鼠标按下的处理程序,但也适用于其他处理程序):

将处理程序分配给节点。假设您有一组按钮:

for (Button button : buttons) {
    button.setOnMousePressed(this::onPress);
}
void onPress(MouseEvent event) {
    int column = GridPane.getColumnIndex((Node) event.getSource());
    int row = GridPane.getRowIndex((Node) event.getSource());
    System.out.println(String.format("Node clicked at: column=%d, row=%d", column, row));
}
鼠标按下处理程序方法:

for (Button button : buttons) {
    button.setOnMousePressed(this::onPress);
}
void onPress(MouseEvent event) {
    int column = GridPane.getColumnIndex((Node) event.getSource());
    int row = GridPane.getRowIndex((Node) event.getSource());
    System.out.println(String.format("Node clicked at: column=%d, row=%d", column, row));
}

哇!完美的非常感谢!:)“我没有关于您打算实现什么的信息,但就我个人而言,我更喜欢使用节点本身,而不是布局管理器中可能发生变化的一些索引。”我该如何做到这一点?我通常只将每个
节点
存储在一个单独的2D数组中,并从那里引用它。“处理节点本身”是什么意思?