JavaFx+JFoenix彻底解决Image读取图片路径问题
文章目录
- JavaFx+JFoenix彻底解决Image读取图片路径问题
- 1.JavaFx的Image类加载文件三种策略
- 2.Image类三种策略加载图片Demo
- 2.1. Image加载网络图片资源
- 2.2. Image加载本地系统文件
- 2.3.Image加载项目ClassPath图片资源
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();
}
}