提问者:小点点

在JavaFX控制器中手动降低对象层的方法?


我试图创建一个游戏,我需要网格窗格的一些部分有点击事件,有些没有。我这样做的方式是手动将窗格添加到主网格窗格作为点击事件。但这些也涵盖了我的一些其他点击事件。我有一个单独的函数,名为“对象点击”,它在单击ImageView时触发。我希望ImageView在窗格点击事件之上一层。

}

我尝试过在SceneBuilder中将ImageView移动到顶部,但无济于事。

   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个答案

匿名用户

我尝试过在SceneBuilder中将ImageView移动到顶部

这是错误的方向。最底部的子级(子级列表中索引最高的子级)被绘制在其他子级的顶部。此外,由于这些子级是在加载fxml时添加的,即在执行for循环之前,GridPane. add方法在现有元素的基础上添加新元素。

解决此问题的一种方法是在子列表的开头添加Pane。请注意,对于大型numCols*numRow,您应该重写它以使用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
}