JavaFX:按行和列获取节点

Posted

技术标签:

【中文标题】JavaFX:按行和列获取节点【英文标题】:JavaFX: Get Node by row and column 【发布时间】:2014-01-16 12:51:16 【问题描述】:

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

【问题讨论】:

重复***.com/q/20655024/3110608 【参考方案1】:

我没有看到任何直接的 API 来逐行列索引,但您可以使用来自 PanegetChildren API,以及来自 GridPanegetRowIndex(Node child)getColumnIndex(Node child)

//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)

【讨论】:

有什么理由使用java.lang.Integer而不是标准? 请注意,也允许为索引指定null;在这种情况下,索引被视为0。在您的情况下,这会导致 NPE。 我认为getRowIndex()getColumnIndex() 方法只有在节点上设置了这样的约束时才会返回一个值,即不能保证它们会返回列或行索引。跨度> @F*** 抱歉,我的意思是 getRowIndex。我有一个 getRowIndex(node) 返回 null 但我期望为 0 的场景。如果我将同一个节点放在任何其他行中,该方法将返回 1,2,3... 确保您的约束已设置。 Scenebuilder 喜欢将 0 视为未设置并将该字段设为空。所以在fxml文件中手动设置约束。例如 。此外,由于不能保证从 getRowIndex/getColumnIndex 返回非空值,因此您应该使用 Integer 对象并在 if 语句中检查空值。例如if(null != nodeRow && null != nodeCol ...【参考方案2】:

@invariant 的上述回答是完全正确的,但对于一些这样做的人来说,可能存在性能问题,尤其是对于包含许多元素的 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

【讨论】:

以上是关于JavaFX:按行和列获取节点的主要内容,如果未能解决你的问题,请参考以下文章

按行和列排序的显示表[重复]

如何将行和列添加到 JavaFX 8 TableView

获取单元格的行和列,xlwings UDF在哪里被调用?

如何从数据网格中获取行和列

获取JTable点击事件的行和列

在 QTableView 上单击鼠标左键获取行和列?