舒适的映射

时间:2015-07-17 15:33:02

标签: javafx fxml

我有一个网格,我在其中显示不同的图像。当用户单击图像时,应触发事件。我的代码现在看起来像这样:

<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对象和一个事件方法吗?例如。是不是有办法点击对象?

1 个答案:

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