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

时间:2015-02-04 11:21:49

标签: javafx

当我点击时,我试图获取gridpane的行/列索引。

我在JTable(java swing)中寻找像getSelectedColumn()这样的方法

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

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

我通过语法创建网格组件。所以节点名称是相同的。 我怎样才能获得价值?我的部分代码如下。

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

2 个答案:

答案 0 :(得分:7)

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

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上,那么同样可行,这里作为lambda表达式:

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

但请注意,getRowIndexgetColumnIndex方法仅在先前设置数据时才有效,如这些方法的文档中所指定的那样。

我没有关于你打算实现什么的信息,但我个人更喜欢使用节点本身而不是布局管理器中可能会改变的一些索引。

答案 1 :(得分:1)

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