JavaFx+JFoenix彻底解决Image读取图片路径问题

JavaFx+JFoenix彻底解决Image读取图片路径问题

1.JavaFx的Image类加载文件三种策略

javaFx的Image类支持三种策略加载图片资源,分别是 网络URL资源、本地系统文件资源,项目ClassPath路径。
下面就重点介绍下图片三种加载策略

2.Image类三种策略加载图片Demo
2.1. Image加载网络图片资源

Image加载网络图片Url地址格式:http:开头+图片url地址

package javafxdemo;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import java.io.File;
import java.net.MalformedURLException;
import java.util.Locale;

/**
 * @author bruce
 * 
 * Image类加载图像有三种方式:网络Url、本地系统文件Url、和项目ClassPath资源Url。下面就来介绍三种资源的加载方式。
 */
public class ImageDemo extends Application {
    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        BorderPane borderPane = new BorderPane();

        //第一种添加图片方式:网络url格式= (http:开头+图片url路径)
        Image image = new Image(getHttpUrl());

        //创建ImageView查看图片对象
        ImageView imageView = new ImageView();
        //添加查看的Image对象
        imageView.setImage(image);

        //将ImageView添加到根节点容器中。
        borderPane.setCenter(imageView);

        //获取图片的宽高尺寸
        double width = image.getWidth();
        double height = image.getHeight();

        //1.将容器添加到的场景中,将图片的宽高传进到scene中。
        Scene scene = new Scene(borderPane, width, height);
        //2.将场景添加到窗口中
        stage.setScene(scene);
        //3.打开窗口
        stage.show();
    }

    //网络url地址
    private String getHttpUrl() {
        String httpUrl = "https://timgsa.baidu.com/timg?image&quality=80&size=" +
                "b9999_10000&sec=1586625302308&di=7a7ffe77fb98c069c1794d485e1ee816&imgtype" +
                "=0&src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%" +
                "2F20180201%2Ff494e9b978b046ce98243d7a9344a07e.gif";
        return httpUrl;
    }
}
2.2. Image加载本地系统文件

Image类加载本地系统资源文件格式:file:系统图片绝对路径

package javafxdemo;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

import java.io.File;
import java.net.MalformedURLException;
import java.util.Locale;

/**
 * @author bruce
 * 
 * Image类加载图像有三种方式:网络Url、本地系统文件Url、和项目ClassPath资源Url。下面就来介绍三种资源的加载方式。
 */
public class ImageDemo extends Application {
    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        BorderPane borderPane = new BorderPane();

        //第二种添加图片方式有两种写法一个是直接写:
        //本地系统文件url地址格式=(file:开头+图片路径地址)
        //,另一格式用File类加载本地文件软后转为String格式。
        Image image = new Image(getLoalFile());

        //创建ImageView查看图片对象
        ImageView imageView = new ImageView();
        //添加查看的Image对象
        imageView.setImage(image);

        //将ImageView添加到根节点容器中。
        borderPane.setCenter(imageView);

        //获取图片的宽高尺寸
        double width = image.getWidth();
        double height = image.getHeight();

        //1.将容器添加到的场景中,将图片的宽高传进到scene中。
        Scene scene = new Scene(borderPane, width, height);
        //2.将场景添加到窗口中
        stage.setScene(scene);
        //3.打开窗口
        stage.show();
    }
    //系统资源文件地址:直接写本地资源地址。
    private String getLoalUrl() {
        String localFile = "file:/D:/long/Downloads/1J0124292-3.jpg";
        return localFile;
    }

    //系统资源文件地址:用File加载本地资源文件地址。
    private String getLoalFile() throws MalformedURLException {
        File file = new File("D:/long/Downloads/1J0124292-3.jpg");
        String localFile = file.toURI().toURL().toString();
        return localFile;
    }
}
2.3.Image加载项目ClassPath图片资源

特别容易出现加载图片路径出错的就是这种方式,因为对他的加载资源原理没有搞清楚走了许多弯路,这里说明下他加载原理,以后不论在什么路径下都不会出错了。
1.加载classPath原理
写代码看的是src下的源代码路径,编译后代码运行寻找资源看的是Classes输出字节码文件路径,因为我们使用的IDEA开发工具都会按照src源代码路径自动在classess输出文件夹中创建相同路径的包存放编译后的java文件,因此我们在运行时候并没有出现图片资源找不到情况。但是有些时候因为配置等原因出现IDEA在编译后并没有将图片拷贝到classess对应的目录中,就会出现我们源文件中有图片资源,运行时候还提示报错在路径下没有找到文件,这也证明了在代码运行时候实际加载图片资源是在classes中寻找。

2.Image加载图片当前路径就是从Image所在的类的包名为起点,比如下面我的工程,ImageDemo类所在的包是javafxdemo,此时将图片放到源文件的javafxdemo包下,路径填写"javafxdemo/cat.jpg"运行代码也会报错,因为在classes–javafxdemo下没有这个文件,只有将cat.jpg文件拷贝一份放到这里运行就会报错。同样的道理,如果将cat.jpg图片放到源代码的resources资源文件夹下,那么我们读取文件的路径就要跳出javafxdemo包到他的父类写也就是classes路径下,classes路径和resources是同级目录,这个时候在进入resources就可以读取cat.jpg文件了。读取路径就是这样的:"…/resources/cat.jpg"
3.上面介绍了读取ClasssPath读取文件的原理后下面就看一个Demo来对上面的概述理解。
在这里插入图片描述

package javafxdemo;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

import java.io.File;
import java.net.MalformedURLException;
import java.util.Locale;

/**
 * @author bruce
 * @create 2020/4/11 21:45
 * Image类加载图像有三种方式:网络Url、本地系统文件Url、和项目ClassPath资源Url。下面就来介绍三种资源的加载方式。
 */
public class ImageDemo extends Application {
    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        BorderPane borderPane = new BorderPane();

        /**
         * 第三种加载项目ClassPath路径文件,这个时候读取文件总会
         * 出现异常 Invalid URL or resource not found
         * 经过多次尝试终于搞清楚了这里加载资源的原则:其实他加载
         * 资源时候并不是看当前src下源代码路径下图片是否存在,而是
         * 在文件编译后输出的class目录中
         * 加载图片资源。因此我们在写这种classpath路径的时候要确保
         * 编译输出目录中是否有我们的图片,如果有那么就不会报错。
         * 没有就会报错。
         */
        Image image = new Image("../resources/cat.jpg");


        //创建ImageView查看图片对象
        ImageView imageView = new ImageView();
        //添加查看的Image对象
        imageView.setImage(image);

        //将ImageView添加到根节点容器中。
        borderPane.setCenter(imageView);

        //获取图片的宽高尺寸
        double width = image.getWidth();
        double height = image.getHeight();

        //1.将容器添加到的场景中,将图片的宽高传进到scene中。
        Scene scene = new Scene(borderPane, width, height);
        //2.将场景添加到窗口中
        stage.setScene(scene);
        //3.打开窗口
        stage.show();
    }
}

在这里插入图片描述

  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值