javafx GridPane检索特定的Cell内容

时间:2013-12-18 10:04:24

标签: javafx cell gridpanel

我想检索Gridpane中一个特定单元格的内容。我用

将按钮放在单元格中
setConstraints(btt , 0 ,1 ) 

setConstraints(btt , 0 ,2 )

getChildren().add....

就我而言,GridPane.getChildren.get(10)并不好。我想直接进入单元格(4,2)并获取其内容。

5 个答案:

答案 0 :(得分:21)

嗯,我想如果没有解决方案从gridpane获取特定节点的是列和行索引,我有一个函数来做到这一点,

private Node getNodeFromGridPane(GridPane gridPane, int col, int row) {
    for (Node node : gridPane.getChildren()) {
        if (GridPane.getColumnIndex(node) == col && GridPane.getRowIndex(node) == row) {
            return node;
        }
    }
    return null;
}

答案 1 :(得分:5)

假设您有一个8x8 girdPane,其中i是行,j是列,您可以写:

myGridPane.getChildren().get(i*8+j)

返回类型是一个对象,所以你必须把它投出来,就我而言:

(StackPane) (myGridPane.getChildren().get(i*8+j))

答案 2 :(得分:1)

您可以添加一个列表,其中包含网格窗格的每个子项,每个子项的父项必须具有两个整数行和列,因此,您只需要遍历该列表,看看它是否具有正确的坐标! (您应该适当地添加一个新类,以便可以存储这些坐标),这是我的解决方案的一个最小示例

import java.util.ArrayList;
import java.util.List;

import javafx.scene.Node;
import javafx.scene.layout.GridPane;

public class SpecialGridPane extends GridPane {
    List<NodeParent> list = new ArrayList<>();

    public void addChild(int row, int column, Node node) {
        list.add(new NodeParent(row, column, node));
        setConstraints(node, column, row);
        getChildren().add(node);
    }

    public Node getChild(int row, int column) {
        for (NodeParent node : list) {
            if (node.getRow() == row && node.getColumn() == column)
                return node.getNode();
        }
        return null;
    }
}

class NodeParent {
    private int row;
    private int column;
    private Node node;

    public NodeParent(int row, int column, Node node) {
        this.row = row;
        this.column = column;
        this.node = node;
    }

    public int getRow() {
        return row;
    }

    public int getColumn() {
        return column;
    }

    public Node getNode() {
        return node;
    }
}

答案 3 :(得分:1)

在这个问题上,我对提出的解决方案有些麻烦,因为方法[2, 4, 6, 8, 10, 12]可能在第一行或列(当索引实际上为0时)返回GridPane.getColumnIndex(Node node)。因此,我研究了wrapperclass null,并得出了以下解决方案。 也许它将帮助其他有相同问题的人。

Integer

答案 4 :(得分:1)

如重复中所述,您可能会遇到所选答案的性能问题 (getNodeFromGridPane)

这是克服这个问题的方法:https://stackoverflow.com/a/65386693/11284920 但是,总结一下:

1.有一个二维数组:

private Node[][] gridPaneArray = null;

2.在视图初始化期间调用这样的方法:

    private void initializeGridPaneArray()
    {
       this.gridPaneArray = new Node[this.gridModel.getLines() [this.gridModel.getColumns()];
       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