我正在根据“感知”和吃食物的错误进行网格式游戏/模拟。我正在使用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);
然而,当我尝试IllegalArgumentException
行时,我会获得add
。
关于如何做到这一点的任何想法?或者甚至更好,关于如何最好地显示最终将使用精灵而不是文本的不断变化的网格的任何想法?
答案 0 :(得分:13)
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);
答案 1 :(得分:1)
我同意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中的所有节点并检查所需条件的匹配项,在本例中为行和列。
答案 2 :(得分:0)
你直接调用了getChildren()。remove()方法会导致gridpane与约束不同步。添加时,它还会为节点设置约束。添加clearConstraints()方法。