删除JavaFX中的可单击窗格(在控制器中)

时间:2019-06-10 00:07:49

标签: javafx

我正在设置游戏,我尝试了多种方法来尝试摆脱这些“转弯”仅需要一次的窗格。我需要一种反转在每个单元格中创建多个窗格的函数的方法。我已经尝试过了:

      for (int i = 0 ; i < numCols ; i++) {
                for (int j = 0; j < numRows; j++) {
                    addPane(i, j);
                }
            }
        }


        private void addPane(int colIndex, int rowIndex) {
            Pane pane = new Pane();
            pane.setOnMouseEntered(e -> {
                System.out.printf("Mouse enetered cell [%d, %d]%n", colIndex, rowIndex);
            });
            grid.add(pane, colIndex, rowIndex);
        }
private void removePane(int colIndex, int rowIndex) {
            Pane pane2 = new Pane();
            pane.getChildren().remove(pane2);
        }

      for (int i = 0 ; i < numCols ; i++) {
                for (int j = 0; j < numRows; j++) {
                    removePane(i, j);
                }
            }
        }

我希望在使用removePane函数时所有窗格都将被删除,但是没有任何变化。窗格仍在每个单元格中。

1 个答案:

答案 0 :(得分:0)

List.remove(Object)的工作方式如下:

如果使用equals进行比较时,如果列表中存在与传递给方法的参数匹配的元素,则将其删除。

由于Pane没有覆盖equals方法,因此如果传递的元素是列表中的对象之一,则删除子列表的元素。自创建新的Pane以来,removePane不会更改子列表。

您需要使用其他方式(例如,

)删除GridPane的子级
  • 使用子列表的the clear method。如果有要保留的节点,这会删除所有的所有子节点,将不起作用。如果您知道要删除的子级的索引范围,则可以在a sublist上调用clear
  • 使用the removeIf method。这样,您就可以传递用于检查是否应删除元素或将其保留在列表中的Predicate
  • 使用removeAll(Collection) / retainAll(Collection)方法传递要删除/保留的Collection个孩子。这要求您在某些集合的代码中跟踪要删除/不删除的窗格。您可以例如使用addPane方法将这些节点添加到集合中。从GridPane的子列表中删除节点后,请确保更新此集合,除非以后需要它们,因为这可能导致内存泄漏。
  • ...