JavaFX ConcurrentModificationException с GridPane.get ... Index () - PullRequest
0 голосов
/ 13 октября 2018

Мне нужно отредактировать содержимое chunkLarge, поэтому я пытаюсь переместить их в дублирующую GridPane:

chunkLarge2 = new GridPane();
for (Node n : chunkLarge.getChildren()) {
    chunkLarge2.add(n, GridPane.getColumnIndex(n), GridPane.getRowIndex(n));
}

Это выдает ConcurrentModificationException.Я думаю, это из-за GridPane.get...Index(n).

Я немного поискал в Интернете и нашел несколько вещей.Во-первых, я мог использовать Iterator для циклического перемещения по спискам, но я не уверен, как его применить здесь.Затем я мог попробовать .getChildrenUnmodified() вместо вашего стандартного .getChildren(), но вместо этого просто бросил NoSuchElementException.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

ConcurrentModificationException выброшено, потому что вы перебираете дочерний список chunkLarge и одновременно удаляете из него элементы.

Удаление происходит при попытке добавить дочерний узел к chunkLarge2 - у узла javafx может быть только один родительский элемент, поэтому дочерний узел n является удаленным из chunkLarge 'Сначала список детей, а затем он добавляется в список детей chunkLarge2.

Как вы уже сказали, вы можете использовать итератор для решения проблемы:

Iterator<Node> it = chunkLarge.getChildren().iterator();

while (it.hasNext()) {
    // get the next child node
    Node node = it.next();

    int column = GridPane.getColumnIndex(node);
    int row = GridPane.getRowIndex(node);

    // remove method is used to safely remove element from the list          
    it.remove();  

    // node is already removed from chunkLarge, 
    // so you can add it to chunkLarge2 without any problems       
    chunkLarge2.add(node, column, row); 
}

Или без итератора:

// transfer children from chunkLarge to chunkLarge2
chunkLarge2.getChildren().addAll(chunkLarge.getChildren());

// note that you're not iterating over chunkLarge's children list
// (addAll method will make a copy and work with it),
// so it's safe to let the children be automatically deleted
0 голосов
/ 14 октября 2018

Экземпляр узла может использоваться только как дочерний элемент одного родителя или как корень одной сцены.Если вы добавляете узел в качестве потомка нового родителя, он удаляется из старого родителя.Это означает, что ваш цикл фактически делает то же самое, что и следующий цикл (установка индексов сетки не требуется, поскольку вы хотите сохранить эти индексы):

for (Node n : chunkLarge.getChildren()) {
    chunkLarge.getChildren().remove(n);
    chunkLarge2.getChildren().add(n);
}

Поскольку вы изменяете список, по которому вы перебираете,означает, что кроме Iterator вы получите ConcurrentModificationException.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...