从错误

时间:2018-04-17 13:19:44

标签: java image http javafx imageview

我正在尝试从网址加载图片,这非常简单且效果很好。但是,如果图像不存在,我希望它默认为本地图像。我遇到的问题是它不会抛出任何异常。相反,它不会显示任何东西。我假设我必须验证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 个答案:

答案 0 :(得分: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 :(得分:-1)

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

对于实际图片,我还会使用ImageIO将网址加载为BufferedImage。这会引发IOException,因此如果错误或未链接到支持的图像类型,则不会发生任何事情。

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