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