JavaFX:如何在网格窗格中获取列和行索引?

JavaFX : How to get column and row index in gridpane?

我试图在单击时获取网格窗格的 row/column 索引。

我正在 JTable(java swing)

中寻找像 getSelectedColumn() 这样的方法

我搜索了这个。 gridPane.getRowIndex(node)

但这对我没有帮助。因为它需要 node name 来获取 row/column index.

我用for语法做了一个grid的组件。所以节点名称是相同的。 我怎样才能得到价值?我的部分代码如下。

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

这里有一个示例,说明如果您只想在网格窗格上而不是在单元格中的节点上使用鼠标侦听器,您可以如何做到这一点。为简单起见,我使用标签作为单元节点,但您可以使用任何您喜欢的东西。

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

    }

}

您在控制台看到点击的单元格信息。

如果将侦听器放在单元格节点而不是网格窗格上,同样会起作用,这里是一个 lambda 表达式:

        label.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> System.out.println( "Node: " + label + " at " + GridPane.getRowIndex( label) + "/" + GridPane.getColumnIndex( label)));

但请注意,getRowIndex and getColumnIndex 方法仅在数据已预先设置时才有效,如这些方法的文档中所述。

我不知道您打算实现什么,但我个人更喜欢使用节点本身,而不是布局管理器中可能会更改的某些索引。

正如@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));
}