Удаление интерактивных панелей в JavaFX (в контроллере) - PullRequest
0 голосов
/ 10 июня 2019

Я настраиваю игру, и я попробовал множество способов избавиться от этих панелей, которые нужны только один раз за «ход». Мне нужен способ инвертировать функцию, которая создает несколько панелей в каждой ячейке. Я пробовал это:

      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 голосов
/ 10 июня 2019

List.remove(Object) работает следующим образом:

Если в списке есть элемент, который соответствует параметру, переданному методу при сравнении с использованием equals, он удаляется.

Так какPane не переопределяет метод equals, элемент дочернего списка удаляется, если переданный элемент является одним из объектов в списке.Поскольку вы создаете новый Pane, removePane оставляет дочерний список без изменений.

Вам необходимо удалить дочерние элементы GridPane, используя другие средства, например,

  • , используя метод clear дочернего списка.Это удалит всех дочерних элементов и не будет работать, если есть узлы, которые вы хотите сохранить.Если вам известен диапазон индексов дочерних элементов, которые нужно удалить, вы можете вызвать clear для как список .
  • , используя метод removeIf .Это позволяет вам передать Predicate, который используется для проверки, должен ли элемент быть удален или сохранен в списке.
  • с использованием removeAll(Collection) / retainAll(Collection) метод передачи Collection детей, которых вы хотите удалить / оставить.Это требует от вас отслеживания панелей, которые вы хотите удалить / не удалить в своем коде в некоторой коллекции.Например, вы можете добавить эти узлы в коллекцию методом addPane.Обязательно обновите эту коллекцию после удаления узлов из дочернего списка GridPane, если только они не понадобятся позже, поскольку это потенциальный источник утечки памяти.
  • ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...