提问者:小点点

JavaFX:按行和列获取节点


如果我知道它的位置(行和列),是否有任何方法可以从网格窗格中获取特定节点,或者从网格窗格中获取节点的任何其他方法?


共2个答案

匿名用户

我没有看到任何直接的API来逐行获取索引,但是您可以使用getKidsAPI从Pane,以及getRowIndex(Node child)getColumnIndex(Node child)GridPane

//Gets the list of children of this Parent. 
public ObservableList<Node> getChildren() 
//Returns the child's column index constraint if set
public static java.lang.Integer getColumnIndex(Node child)
//Returns the child's row index constraint if set.
public static java.lang.Integer getRowIndex(Node child)

这是使用GridPane中的行和列索引获取Node的示例代码

public Node getNodeByRowColumnIndex (final int row, final int column, GridPane gridPane) {
    Node result = null;
    ObservableList<Node> childrens = gridPane.getChildren();

    for (Node node : childrens) {
        if(gridPane.getRowIndex(node) == row && gridPane.getColumnIndex(node) == column) {
            result = node;
            break;
        }
    }

    return result;
}

重要更新:getRowIndex()getColumnIndex()现在是静态方法,应该更改为GridPane. getRowIndex(node)GridPane.getColumnIndex(node)

匿名用户

上面的答案是完全正确的,但是对于一些这样做的人来说,可能会有性能问题,尤其是对于包含许多元素的GridPanes。还有在使用循环(迭代GridPane的所有元素)时。

我建议您初始化网格窗格中包含的所有元素/节点的静态数组。然后使用此数组获取您需要的节点。

1.有一个二维数组:

private Node[][] gridPaneArray = null;

2.在视图初始化过程中像这样调用一个方法:

    private void initializeGridPaneArray()
    {
       this.gridPaneArray = new Node[/*nbLines*/][/*nbColumns*/];
       for(Node node : this.mainPane.getChildren())
       {
          this.gridPaneArray[GridPane.getRowIndex(node)][GridPane.getColumnIndex(node)] = node;
       }
    }

3.获取你的节点

Node n = this.gridPaneArray[x][y]; // and cast it to any type you want/need