当前位置: 首页 > 知识库问答 >
问题:

使用JavaFX上传和显示图像

彭飞虎
2023-03-14

我正在使用JavaFX,在那里我编写了一个包含显示图像的代码,通过我想在我的场景上显示图像,但它不起作用。图像不显示。
当我使用getAbsolutePath()时,它还显示一个错误。虽然我70%的编码已经完成,但我只是坚持在现场显示图像(不上传)。
以下是我正在使用的代码:

package application;
    
import java.util.HashMap;

import java.io.File;

import javafx.application.Application;
import javafx.stage.Stage; 
import javafx.stage.FileChooser;
import javafx.scene.Scene;
import javafx.scene.text.*;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.shape.Circle;
import javafx.scene.control.Button;
import javafx.scene.control.Label;


public class Main extends Application {
    
    public ImageView iv;
    private GridPane gridpane;
 
    
//Image
    Image img = new Image("application/PA_Image.jpg");
    


    
    @Override
    public void start(Stage primaryStage) {
        try {
            

//Upload Image Button
            final Button button  = new Button("Display Image");  
            
//FileChooser
            final FileChooser fileChooser = new FileChooser();


            button.setOnAction(e -> {
                File selectedFile  = fileChooser.showOpenDialog(primaryStage);
                 if (selectedFile != null) { 
                     System.out.println(selectedFile.getAbsolutePath());
                      
                     Image image = new Image(selectedFile.getAbsolutePath()); 
                     iv = new ImageView(image);
                     
                     //Image uploadedImage = new Image(selectedFile.getAbsolutePath());
                     
                 }
            });
            
            final StackPane stac = new StackPane();
            stac.getChildren().add(button);

            Scene scene = new Scene(stac,400,400);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.show();
            
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}

所以,我需要的是通过单击按钮并选择图像来显示我的场景中的图像。

共有1个答案

於宏大
2023-03-14

Image()构造函数需要URI而不是绝对路径。有两种方法可以解决这个问题。

>

  • 通过添加所需的前缀在 URI 中转动绝对路径 file://

    使用<code>InputStream

    示例:

    button.setOnAction(e -> {
        File selectedFile  = fileChooser.showOpenDialog(primaryStage);
        if (selectedFile != null) {
            System.out.println(selectedFile.getAbsolutePath());
    
            final InputStream targetStream; // Creating the InputStream
            try
            {
                targetStream = new DataInputStream(new FileInputStream(selectedFile));
                Image image = new Image(targetStream);
                iv = new ImageView(image);
    
            } catch (FileNotFoundException fileNotFoundException)
            {
                fileNotFoundException.printStackTrace();
            }
    
    
        }
    });
    

    您的代码还存在一些其他问题。

    1. 创建图像视图并对其进行初始化。不是在单击按钮时,而是在开头
    2. 图像视图添加到场景中
    3. 不要在每次单击按钮时都创建新的 ImageView,只需更改图像即可。

    这是我基于你的代码:

    public ImageView iv = new ImageView();
    private GridPane gridpane;
    
    @Override
    public void start(Stage primaryStage) {
    try {
    
    
        //Upload Image Button
        final Button button = new Button("Display Image");
    
        //FileChooser
        final FileChooser fileChooser = new FileChooser();
    
    
        button.setOnAction(e -> {
            File selectedFile = fileChooser.showOpenDialog(primaryStage);
            if (selectedFile != null) {
    
                final InputStream targetStream;
                try {
                    targetStream = new DataInputStream(new FileInputStream(selectedFile));
                    Image image = new Image(targetStream);
                    iv.setImage(image); // Set Image
    
                } catch (FileNotFoundException fileNotFoundException) {
                    fileNotFoundException.printStackTrace();
                }
    
    
            }
        });
    
        final StackPane stac = new StackPane();
        stac.getChildren().add(button);
        stac.getChildren().add(iv); // Add ImageView
    
        Scene scene = new Scene(stac, 1600, 800);
        //scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.show();
    
    } catch (Exception e) {
        e.printStackTrace();
    }
    }
    

  •  类似资料:
    • 我有一个巨大的问题显示一个上传的图片在Spring引导,问题是第一次我上传它,路径是完美的,一切都很好,但图像不显示,当我重新启动服务器图像显示。 我认为这是因为当启动项目时,它编译成一个.jar而没有映像,所以在重新启动项目之前,映像并不真实存在。 我不知道如何解决这个问题,不确定是否可能。

    • 我一直试图使用FXML在JavaFX应用程序中显示我的图像,但没有成功。我的代码: 没有错误,但我的图像没有显示。我想图像已加载,但未显示。 这可能吗?我怎么查?如果是的话,不应该有一个错误给它吗? 事实上,即使我给出了一个不正确的名称,也没有运行时错误。也许没上子弹? 我也试过加载不同的图像和改变尺寸,没有任何效果。 ->运行时错误#1 ->林特错误+运行时错误#1 ->林特错误+运行时错误#1

    • 问题内容: 我使用以下示例,它可以完美运行,但是我想同时上传多张图片。 http://jsfiddle.net/kkhxsgLu/2/ 谢谢您的帮助,我从angularjs开始 问题答案: 解: http://jsfiddle.net/orion514/kkhxsgLu/136/ :)

    • 我有一个装满图像的文件夹要在我正在创建的游戏中实现,我想在窗口中显示这些。这是我迄今为止的代码。 这将是一个程序在IntelliJ/中从jar运行。“资产”文件夹与此文件位于同一目录中。我没有发现文件路径错误,所以我假设它可以找到图像,但它不会出现在屏幕上,而矩形会出现。 公平警告,我正在从头开始学习JavaFX,我发现没有太多关于事物如何工作的解释,所以这可能是一个愚蠢的问题。

    • 它应该显示一个与掷骰子一致的图像,但什么也没有发生。有问题的图像在包中(如果有关系,请单击并拖入项目窗口)。我在system.out.print中添加了t,以便显示Dice1和2的结果,这样我就知道这是有效的。 我还需要添加一些东西来使它看起来像吗?我以前从未在JavaFX中使用过实际的图像....总的来说,我对JavaFX是新手。 GetChildren c:\users\ethan c.b的错

    • 我正在尝试为Vaadin使用EasyUploads插件,但无法显示图像。 当我点击插件的“选择文件”按钮时,它会要求我打开一个文件。我从我的图片中选择了一些.png文件,插件显示了它下面图片的信息。 然后我按下我的“上传”按钮,这是目前需要的,只是为了首先显示上传的图像。 upload=EasyUpload用于选择文件的组件 图像=我与设计师一起绘制到布局中的嵌入组件。 但当我用浏览器查看页面时,