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

时间:2019-06-09 19:57:07

标签: javafx

我正在尝试创建一个游戏,我需要一些网格窗格才能具有单击事件,而有些则不需要。我这样做的方法是将窗格作为单击事件手动添加到主网格窗格中。但是这些还涵盖了我的其他一些点击事件。我有一个名为“ 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。我希望imageview仍然可以点击。

1 个答案:

答案 0 :(得分:0)

  

我尝试将ImageView移至SceneBuilder的顶部

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

解决此问题的一种方法是在子列表的开头添加Pane。请注意,对于大型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
}