首页 文章

从URL和默认图像加载图像时出错

提问于
浏览
0

我正在尝试从URL加载图像,这非常简单,效果很好 . 但是,如果图像不存在,我希望它默认为本 Map 像 . 我遇到的问题是它不会抛出任何异常 . 相反,它不会显示任何东西 . 我假设我必须验证URL如何,但我也想确保它的图像而不是网页/脚本......等

这是我的基本测试代码 . 这有效:

public class DownloadImage extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        VBox root = new VBox();

        String imageSource = "https://www.wbkidsgo.com/Portals/1/Content/Hero/HeroBugsCarrot/Source/Default/WB_LT_HeroImage_Bugs_v1.png";

        ImageView imageView = new ImageView(new Image(imageSource));

        root.getChildren().add(imageView);

        primaryStage.setScene(new Scene(root, 1000, 1000));
        primaryStage.show();

    }
}

但是,如果我加载一个错误的URL,即(门户中的两个s):

String imageSource = "https://www.wbkidsgo.com/Portalss/1/Content/Hero/HeroBugsCarrot/Source/Default/WB_LT_HeroImage_Bugs_v1.png";

它只是空白 . 我考虑过在创建映像之前创建HTTP客户端并发送请求,但生成HTTP客户端需要几秒钟,我将加载大约300个左右的图像 . 我想我可以有一个http客户端,并为每个图像发出一个请求并检查响应数据类型以查看它是否是一个图像,但有更好的方法吗?

2 回答

  • 1

    您可以使用 errorPropertyexceptionProperty 来检查图像的错误状态:

    import javafx.application.Application;
    import javafx.application.Platform;
    import javafx.scene.image.Image;
    import javafx.stage.Stage;
    
    public class ImageTest extends Application {
    
        public static void main(String[] args) {
            launch(args) ;
        }
    
        @Override
        public void start(Stage primaryStage) {
            String[] urls = new String[]{
                    "https://www.wbkidsgo.com/Portals/1/Content/Hero/HeroBugsCarrot/Source/Default/WB_LT_HeroImage_Bugs_v1.png",
                    "https://www.wbkidsgo.com/Portalss/1/Content/Hero/HeroBugsCarrot/Source/Default/WB_LT_HeroImage_Bugs_v1.png"
            } ;
    
            for (String url : urls) {
                Image image = new Image(url);
                if (image.isError()) {
                    System.out.println("Error loading image from "+url);
                    // if you need more details
                    // image.getException().printStackTrace();
                } else {
                    System.out.println("Successfully loaded image from " + url);
                }
            }
            Platform.exit();
        }
    
    }
    

    其中给出了以下输出:

    Successfully loaded image from https://www.wbkidsgo.com/Portals/1/Content/Hero/HeroBugsCarrot/Source/Default/WB_LT_HeroImage_Bugs_v1.png
    Error loading image from https://www.wbkidsgo.com/Portalss/1/Content/Hero/HeroBugsCarrot/Source/Default/WB_LT_HeroImage_Bugs_v1.png
    
  • -1

    您可以使用 ImageView.setImage() 方法更改图像 . 我建议使用 BufferedImage 形式的默认图像初始化 ImageView ,然后使用实际图像进行设置 . 您可以使用 ImageIO 从文件系统或类路径加载它 .

    至于实际图像,我还会使用 ImageIO 将URL加载为 BufferedImage . 这会抛出 IOException ,因此如果它出错或者没有链接到支持的图像类型,则不会发生任何事情 .

    如果您对线程和并发性了解很多,我会将图像加载到另一个线程上,这样它就不会冻结您的主线程 .

相关问题