Java开发桌面程序学习(七)——ImageView设置图片以及jar包读取fxml文件
2023-02-18 16:36:33 时间
ImageView设置图片
JavaFx的ImageView,设置图片不能直接通过属性设置,只能通过代码来设置
ImageView设置图片
首先,我们让fxml对应的那个controller的java文件实现Initializable
接口,之后就在复写的该接口的initialize方法中设置我们ImageView的图片
我的图片是放在了一个img文件夹里
之后,和之前的fxml一样,得去修改pom.xml
,不然maven就会把img这个文件夹的内容全部忽略掉,之后就会找不到图片文件
@Override
public void initialize(URL location, ResourceBundle resources) {
//设置图片,inPathImg是ImageView
Image image = new Image(getClass().getResource("img/file.png").toString());
inPathImg.setImage(image);
}
扩展,封装工具类PathUtil
上面的虽然是成功设置了图片,但是每次这样写也是麻烦,所以我就封装了一个类来快速得到图片
/**
* 获得图片文件,
* @param o 当前的class,传入this即可
* @param fileName 图片名+扩展名
* @return 图片image
*/
public static Image getImg(Object o, String fileName) {
URL res = o.getClass().getResource("img");
if (fileName.contains(".")) {
String temp = res.toString() + "/" + fileName;
return new Image(temp);
}
return null;
}
使用的时候这样用
@Override
public void initialize(URL location, ResourceBundle resources) {
//设置图片
inPathImg.setImage(PathUtil.getImg(this, "file.png"));
outPathImg.setImage(PathUtil.getImg(this, "file.png"));
}
扩展,工具类获得fxml文件路径
原本,测试的时候是没有问题的,但是,如果是项目封装成jar包,之后打开就会报错。
网上查了资料,原来是jar包中不能直接使用File这个类,要想使用jar包里面的文件,得使用IO流的方式
/**
* 获得fxml文件路径
* @param o class文件,传入this
* @param fileName 文件名
* @return
*/
public static URL getFxmlPath(Object o,String fileName) {
return o.getClass().getResource("fxml/"+fileName+".fxml");
}
/**
* 获得文件
* @param Object o this
* @param String fileName 文件名
*/
public static InputStream getFxmlFile(Object o,String fileName) {
return o.getClass().getResourceAsStream("fxml/"+fileName+".fxml");
}
Main里面调用
@Override
public void start(Stage primaryStage) throws Exception {
FXMLLoader loader = new FXMLLoader(); // 创建对象
loader.setBuilderFactory(new JavaFXBuilderFactory()); // 设置BuilderFactory
loader.setLocation(PathUtil.getFxmlPath(this, "scene_main"));//获得fxml的路径
InputStream inputStream = PathUtil.getFxmlFile(this, "scene_main");//加载jar包中的fxml文件
Object o = loader.load(inputStream);
//这是之前使用的方式,使用的是FXMLLoader的静态方法,如果使用jar包的方式,则会报错
//Parent root = FXMLLoader.load(PathUtil.getFxmlPath(this,"scene_main"));
Parent root = (Parent) o;
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 600, 400));
primaryStage.show();
}
PathUtil源码
package wan.Utils;
import java.io.InputStream;
import java.net.URL;
import javafx.scene.image.Image;
/**
* @author StarsOne
* @date Create in 2019/6/5 0005 14:01
* @description
*/
public class PathUtil {
/**
* 获得图片文件,
* @param o 当前的class,传入this即可
* @param fileName 图片名+扩展名
* @return 图片image
*/
public static Image getImg(Object o, String fileName) {
URL res = o.getClass().getResource("img");
if (fileName.contains(".")) {
String temp = res.toString() + "/" + fileName;
return new Image(temp);
}
return null;
}
/**
* 获得fxml文件路径
* @param o class文件,传入this
* @param fileName 文件名
* @return
*/
public static URL getFxmlPath(Object o,String fileName) {
return o.getClass().getResource("fxml/"+fileName+".fxml");
}
public static InputStream getFxmlFile(Object o,String fileName) {
return o.getClass().getResourceAsStream("fxml/"+fileName+".fxml");
}
}
相关文章
- SpringBoot自定义注解+异步+观察者模式实现业务日志保存
- 还在使用@Autowrired注入?不妨试试@RequiredArgsConstructor
- 后端统一处理返回前端日期LocalDateTime格式化去T,Long返回前端损失精度问题
- 手写自定义springboot-starter,感受框架的魅力和原理
- Idea运行支付宝网站支付demo踩坑解决及其测试注意事项
- MyBatis之ResultMap的association和collection标签详解
- docker搭建yapi接口文档系统、Idea中上传接口、在线调用
- HashMap底层原理及jdk1.8源码解读
- JUC在深入面试题——三种方式实现线程等待和唤醒(wait/notify,await/signal,LockSupport的park/unpark)
- JDK8中String的intern()方法详细解读【内存图解+多种例子+1.1w字长文】
- 使用Vite快速构建Vue3+ts+pinia脚手架
- Elasticsearch高级检索之使用单个字母数字进行分词N-gram tokenizer(不区分大小写)【实战篇】
- Redis6.0.6的三大内存过期策略和八大淘汰策略
- Mybatis-Plus使用@TableField实现自动填充日期
- Mybatis-Plus高级之LambdaQueryWrapper,Wrappers.<实体类>lambdaQuery的使用
- 若依3.6.0使用Mybatis-plus分页失效以及完美替换Pagehelper
- 基于SpringSecurity的@PreAuthorize实现自定义权限校验方法
- SpringBoot读取.yml配置文件最常见的两种方式-源码及其在nacos的应用
- docker compose搭建redis7.0.4高可用一主二从三哨兵集群并整合SpringBoot【图文完整版】
- springboot整合xxl-job分布式定时任务【图文完整版】