替换JavaFX GridPane中的(row,col)节点
我正在制作基于“感知”和吃食物的错误的网格式游戏/模拟。 我正在使用gridPane(称为worldGrid
)标签来显示错误和食物的网格。 当一个bug将细胞移向食物等时,这显然会不断更新。
我目前有一个函数updateGrid(int col, int row, String cellContent)
,我想用[row,col]替换标签,该标签在cellContent中有新文本。
我有以下工作
worldGrid.add(new Label(cellContent), row,col);
但是我担心这只是在当前标签的顶部添加一个标签,显然超过100次的模拟迭代并不理想。
我在添加标签之前尝试了这个:
worldGrid.getChildren().remove(row,col);
但是,在尝试执行add
行时,我会收到IllegalArgumentException
。
关于如何做到这一点的任何想法? 或者甚至更好,关于如何最好地展示最终将使用精灵而不是文本的不断变化的网格的任何想法?
grid.add(node,col,row)提供的col / row(ATTENTION first come col!)只是一个布局约束。 这没有提供任何方法来访问像二维数组中的插槽那样的列或行。 因此,要替换节点,您必须知道其对象本身,例如,在单独的数组中记住它们。
然后你就可以调用getChildren()。remove(object)…例如:
GridPane grid = new GridPane(); Label first = new Label("first"); Label second = new Label("second"); grid.add(first, 1, 1); grid.add(second, 2, 2); second.setOnMouseClicked(e -> { grid.getChildren().remove(second); grid.add(new Label("last"), 2, 2); }); box.getChildren().addAll(grid);
我同意Jens-Peter,但我想补充一点,你可以使用GridPane的getColumnIndex和getRowIndex来获取特定节点的位置。
例如(这是在扩展GridPane的组件中):
// set the appropriate label for (Node node : getChildren()) { if (node instanceof Label && getColumnIndex(node) == column && getRowIndex(node) == row) { ((Label)node).setTooltip(new Tooltip(tooltip)); } }
换句话说,遍历GridPane中的所有节点并检查所需条件的匹配项,在本例中为行和列。
您直接调用getChildren()。remove()方法将导致gridpane与约束不同步。 添加时,它还会为节点设置约束。 添加clearConstraints()方法。