如何通过从文件资源管理器中选择文件来使用javaFX显示图像

时间:2018-02-24 20:23:42

标签: java javafx

1.我有一个打开窗格的代码,我可以打开文件浏览器,但是当我从文件浏览器中选择它时,我不知道如何打开所述图像。此代码也可用于不同的@Overrride语句,但我只是设法使用一个语句来实现这一点。有没有办法让我从另一个Override语句中调用其中一些事件?

  @Override
    public void start(Stage primaryStage) {
    //Stage
    primaryStage.setTitle("title");
    BorderPane pane = new BorderPane();
    Scene scene = new Scene(pane);


    Button load = new Button("Load");
    load.setOnAction(loadEventListener);

    ImageView myImageView = new ImageView();

    HBox rootBox = new HBox();
    rootBox.getChildren().addAll(load, myImageView);


    //Toolbar
    HBox toolbarArea = new HBox( 10 );
    toolbarArea.setPadding( new Insets( 10 ) );


    primaryStage.setScene(scene);
    primaryStage.show();

    //Puts buttons on bottom bar
    toolbarArea.getChildren().addAll( load );
    pane.setBottom( toolbarArea );
}

EventHandler<ActionEvent> loadEventListener
        = t -> {
            FileChooser fileChooser = new FileChooser();

            //Set extension filter
            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);

            //Show open file dialog
            File file = fileChooser.showOpenDialog(null);

            try {
                BufferedImage bufferedImage = ImageIO.read(file);
                Image image = SwingFXUtils.toFXImage(bufferedImage, null);
                ImageView myImageView = new ImageView();
                myImageView.setImage(image);
            } catch (IOException ex) {
                Logger.getLogger(JavaFXPixel.class.getName()).log(Level.SEVERE, null, ex);
            }

        };

1 个答案:

答案 0 :(得分:0)

由于您已经拥有ImageView并已在场景中显示,只需将其图像设置为您加载的图像。

为此,您需要将ImageView设为实例变量:

private ImageView myImageView ;

@Override
public void start(Stage primaryStage) {
    //Stage
    primaryStage.setTitle("title");
    BorderPane pane = new BorderPane();
    Scene scene = new Scene(pane);


    Button load = new Button("Load");
    load.setOnAction(loadEventListener);

    myImageView = new ImageView();

    HBox rootBox = new HBox();
    rootBox.getChildren().addAll(load, myImageView);

    // presumably you intended this somewhere?
    pane.setCenter(rootBox);


    //Toolbar
    HBox toolbarArea = new HBox( 10 );
    toolbarArea.setPadding( new Insets( 10 ) );


    primaryStage.setScene(scene);
    primaryStage.show();

    //Puts buttons on bottom bar
    toolbarArea.getChildren().addAll( load );
    pane.setBottom( toolbarArea );
}

请注意,无需加载缓冲图像然后进行转换。所以你在事件处理程序中所需要的只是

    loadEventListener = t -> {
        FileChooser fileChooser = new FileChooser();

        //Set extension filter
        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);

        //Show open file dialog
        File file = fileChooser.showOpenDialog(null);

        if (file != null) {
            Image image = new Image(file.toURI().toString());
            myImageView.setImage(image);
        }

    };