Очистите gridPane в JavaFX и сохраните линию сетки

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

Итак, я объявляю gridPane следующим образом:

private GridPane gridPecas;

@Override
public void start(Stage primaryStage)
{
    gridPecas = new GridPane();
    gridPecas.setGridLinesVisible(true);

    paintBoard();

    // rest of the code to create and paint the Stage
 }

 private void paintBoard()
 {
    gridPecas.getChildren().clear();
    // Code to fill the board with ImageView and Images of the pieces
 }

Проблема с этим методом заключается в том, что когда "gridPecas.getChildren().clear();" называется, я просто теряю линии сетки из GridPanel.

Как я могу решить эту проблему?


person aliasbody    schedule 21.06.2012    source источник


Ответы (5)


setGridLinesVisible(boolean) предназначен только для отладки:

http://docs.oracle.com/javafx/2/api/javafx/scene/layout/GridPane.html#setGridLinesVisible(boolean)

Например, вы даже не можете изменить цвет gridLines.

Поэтому вам следует найти другой способ сделать линии сетки, а затем вызвать

yourPane.getChildren().clear();

потому что это лучше, чем gridPecas.getChildren().removeAll(pecasFX[i][j]);

person Flo C    schedule 20.08.2013

Способ очистки GridPane и сохранения линий сетки следующий:

    Node node = grid.getChildren().get(0);
    grid.getChildren().clear();
    grid.getChildren().add(0,node);

первый узел * в GridPane (* если вы установите GridLinesVisible перед добавлением элементов в сетку?) содержит линии сетки (и, возможно, другие вещи).

Так что вам просто нужно сохранить этот узел перед очисткой и повторно добавить его после

person vdd.Ju    schedule 09.04.2015

однострочник: grid.getChildren().retainAll(grid.getChildren().get(0));

person j1nma    schedule 12.06.2016

Допустимо очистить GridPane и восстановить линии сетки:

gridPane.setGridLinesVisible(false);
gridPane.getColumnConstraints().clear();
gridPane.getRowConstraints().clear();
gridPane.getChildren().clear();
gridPane.setGridLinesVisible(true);
person VADMARK    schedule 19.02.2020

Хм, я предлагаю вообще не очищать всех детей. Всегда оставляйте imageViews и просто заменяйте изображения, которые они показывают. Чтобы "очистить" доску поставить "пустой" образ.

person Uluk Biy    schedule 22.06.2012
comment
Спасибо за ваши ответы, но я только что нашел идеальное решение xD Вместо того, чтобы делать gridPecas.getChildren().clear(); Я просто делаю это в цикле for: gridPecas.getChildren().removeAll(pecasFX[i][j]); Так что при чтении куска он удаляет его из сетки, и, благодаря исходному коду заполнения доски, у него появляется новый, оставляя границу чистой и обновленной. - person aliasbody; 22.06.2012