当前位置: 首页 > 知识库问答 >
问题:

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

孙钱青
2023-03-14

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

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

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

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

我通过语法制作了一个网格组件。所以节点名称是相同的。如何获取值?我的部分代码在下面。

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个答案

赏新知
2023-03-14

正如@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));
}
许出野
2023-03-14

这里有一个示例,说明如果您只想在网格窗格上而不是单元格中的节点上使用鼠标侦听器,您可以如何执行此操作。为简单起见,我使用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)));

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

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

 类似资料:
  • 如何在JavaFX的网格窗格中获取列索引和行索引。请参见下面的代码 当鼠标在text1上输入时,我想获取GridPane的列索引和行索引 请让我知道。

  • 你好,所以我尝试了许多在线解决方案,如何获得在网格窗格中点击的节点(单元格)。我使用的获取节点的方法如下所示。我也尝试过迭代这个方法之前的所有节点。我已经用场景构建器构建了网格,正如你在下面的图片中看到的,列和行都清楚地存在。我正在尝试这个解决方案如何在鼠标上获得网格窗格行和列ID在JavaFX网格的每个单元格中输入?但是,正如我上面提到的,从行和列返回的值是null。 包含此网格的FXML

  • 问题内容: 如果我知道它的位置(行和列),是否有任何方法可以从gridPane获取特定的节点,或者有什么其他方法可以从gridPane获取节点呢? 问题答案: 我看不出有任何直接的API来获取由行列索引节点,但可以使用API从,并与来自 以下是示例代码,可从中获取使用的行和列索引 重要更新: 和现在是静态方法,应更改为和。

  • 我有一个在网格窗格(2x8)中创建新文本字段的方法。我想知道,一旦它们被创建,我如何访问每个索引中的信息(如:0,0-1,0等)。 代码如下: 这就是我想做的:

  • 问题:我混淆了vbox和gridpane。。通常,当您可以使用vbox时,您也可以使用包含1列和n行的gridPane,因此我不确定何时使用每一列和它们之间的差异。 事实: > 我知道网格窗格有n行和n列。 我知道vbox只会垂直列出组件。(n行1列) 困惑:当我想垂直列出40-50个(水平框或其他组件)时,我不知道应该选择哪一个,因为有时我会看到人们将这些组件作为子组件添加到vbox中,而其他人

  • 问题内容: 我发现自己经常这样编写代码: 相反,我可以做 但这似乎不是“ pythonic”。(您知道…建立索引。该死!)是否有某种语法可以让我使用循环,列表理解或生成器同时提取索引(k)和元素(i)?我认为,任务是在科学计算中进行的,因此循环体中有很多东西,列表理解本身可能不够强大。 我也欢迎有关概念的技巧,尽管我可能没有。谢谢。 问题答案: 您可以使用: 有关循环技术的更多信息。 编辑: 如注