Способ вручную опустить объектный слой в контроллере JavaFX? - PullRequest
0 голосов
/ 09 июня 2019

Я пытаюсь создать игру, и мне нужно несколько частей Grid Pane, чтобы иметь события щелчка, а для некоторых - нет. Я сделал это вручную, добавив панели на главную панель сетки как события щелчка. Но они также охватывают некоторые из моих других событий щелчка. У меня есть отдельная функция с именем «ObjClicked», которая запускается при нажатии ImageView. Мне бы хотелось, чтобы ImageView был слоем над событиями Pane Click.

}

Я пытался переместить ImageView наверх в SceneBuilder, но безрезультатно.

   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);
    }

Это охватывает все «ячейки» панели сетки, включая ImageView. Я ожидаю, что просмотр изображений будет по-прежнему активным.

1 Ответ

0 голосов
/ 09 июня 2019

Я попытался переместить ImageView наверх в SceneBuilder

Это неправильное направление.Самый нижний ребенок (тот, у которого самый высокий индекс в списке детей) рисуется поверх других детей.Кроме того, поскольку эти дочерние элементы добавляются при загрузке fxml, т.е. до выполнения цикла for, метод GridPane.add добавляет новые элементы поверх существующих.

Один из способов решения этой проблемы - добавлениеPane s в начале списка детей.Обратите внимание, что для больших numCols * numRows вы должны переписать это, чтобы использовать метод addAll для массовой вставки узлов, так как добавление узлов в начало ArrayList (список поддержки дочернего списка) имеет субоптимальную производительность, когда это сделанонесколько раз.Возможно, вы не увидите разницу.

private void addPane(int colIndex, int rowIndex) {
    Pane pane = new Pane();

    GridPane.setRowIndex(pane, rowIndex);
    GridPane.setColumnIndex(pane, colIndex);

    pane.setOnMouseEntered(e -> {
        System.out.printf("Mouse enetered cell [%d, %d]%n", colIndex, rowIndex);
    });

    grid.getChildren().add(0, pane); // add pane to front of child list
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...