我有一个网格,我在其中显示不同的图像。当用户单击图像时,应触发事件。我的代码现在看起来像这样:
<GridPane alignment="center" hgap="10" vgap="10">
<ImageView
fx:id="cell1" fitHeight="90" fitWidth="70"
GridPane.columnIndex="0" GridPane.rowIndex="0"
onMouseClicked="#previewClicked1" />
<ImageView
fx:id="cell2" fitHeight="90" fitWidth="
GridPane.columnIndex="1" GridPane.rowIndex="0"
onMouseClicked="#previewClicked2"/>
[...]
</GridPane>
我喜欢这些细胞中的20个。我真的需要为每个这些对象创建一个ImageView对象和一个事件方法吗?例如。是不是有办法点击对象?
答案 0 :(得分:1)
最好的选择只是在Java中,而不是在FXML中。所以你的FXML就是
<GridPane fx:id="imagePane" alignment="center" ... >
</GridPane>
现在,在您的控制器的initialize()
方法中定义ImageView
s:
public class MyController {
@FXML
private GridPane imagePane ;
public void initialize() {
int numColumns = ... ;
int numRows = ... ;
for (int col = 0; col < numColumns; col++) {
for (int row = 0; row < numRows; row++) {
ImageView imageView = new ImageView();
imagePane.add(imageView, col, row);
imageView.setOnMouseClicked(e -> {
// handle click for this image...
});
}
}
}
}
无论如何,这可能会减少代码总数(因为FXML会小得多),如果需要,您可以轻松地将图像视图组织成一个数组。
如果您真的想要在FXML中逐个定义所有图像视图,那么您可以在事件处理程序中获取事件的来源。我不喜欢这种方法,因为必要的垂头丧气,如果你在以后改变一些事情,它可能会使它变得脆弱。但是:
@FXML
private void previewClicked(MouseEvent event) {
ImageView clickedImage = (ImageView) event.getSource();
// ...
}
然后只为所有onMouseClicked="#previewClicked"
设置ImageView
。尽管如此,你仍然需要在FXML中费力地定义所有ImageView
。