FXML/JavaFX 如何使 ImageView 可点击?

FXML/JavaFX How to make an ImageView Clickable?

我想使用 FXML 更改图像视图中的图像并更改图像我打开 fileChooser 以选择应该替换旧图像的图像,我现在有 2 个问题:

如何使 ImageView 可点击这是我为此使用的代码

public void imagePicker(){

    Defaultview.setPickOnBounds(true); // allows click on transparent areas
    Defaultview.setOnMouseClicked((MouseEvent e) -> {
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("Open Resource File");
        fileChooser.showOpenDialog(new Stage());
    });
}

在我的 FXML 文件中我有:

<ImageView fx:id="Defaultview" fitHeight="93" fitWidth="93"
    pickOnBounds="true" preserveRatio="true" onAction='#imagePicker'>

对于图像更改,我想将其从

更改为

Image url="@../images/default.png"

选择图片。

ImageView 没有 onAction 属性(因此我认为您在加载 FXML 文件时应该会遇到运行时错误)。如果你想响应鼠标点击,那么你应该使用 onMouseClicked:

<ImageView fx:id="Defaultview" fitHeight="93" fitWidth="93" 
    pickOnBounds="true" preserveRatio="true" onMouseClicked='#imagePicker'>

在 FXML 中注册事件处理程序意味着 imagePicker() 方法将在事件发生时被调用(即当用户单击图像视图时)。在 onClick 事件发生时调用的方法内部不需要(而且这是不正确的)设置 onClicked 处理程序。您只需要

public void imagePicker(){
    FileChooser fileChooser = new FileChooser();
    fileChooser.setTitle("Open Resource File");
    // use existing window here, don't create a new one:
    File file = fileChooser.showOpenDialog(Defaultview.getScene().getWindow());
    if (file != null) {
        Defaultview.setImage(new Image(file.toURI().toString()));
    }
}

在 JavaFx ImageView 中有 setOnMouseClicked 属性,所以如果你想使用 fileChooser 从你的 PC 导入图像,你需要 添加一个扩展 到您的 FileChooser 以仅定义图像并跳过其他文件

 public void imagePicker(){
     FileChooser fileChooser = new FileChooser();
     FileChooser.ExtensionFilter extFilterJPG = new  FileChooser.ExtensionFilter("JPG files (*.jpg)", "*.JPG");
     FileChooser.ExtensionFilter extFilterPNG = new FileChooser.ExtensionFilter("PNG files (*.png)", "*.PNG");
     fileChooser.getExtensionFilters().addAll(extFilterJPG, extFilterPNG);

    File ChooserFile = fileChooser.showOpenDialog(Defaultview.getScene().getWindow());//your owner
    if (ChooserFile != null) {

        Image image = new Image(ChooserFile.toURI().toString());

        Defaultview.setImage(image);
    }


  }

并将 MouseEvent (setOnMouseClicked) 添加到您的 ImageView 中:

      Defaultview.setOnMouseClicked(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            imagePicker();
        }
    });