JAVA GUI界面动态背景图设计

简介: 在JAVA项目中会用到某一界面的背景,但是静态背景不够鲜明,此文章给出GUI界面的动态背景原理及代码

在做JAVA项目时我们有时候要用到界面的动态背景,但是对于初学者来说通常会使用普通的IO流来设置背景图片,但这往往会出问题的,要么找不到路径,要么动态背景图片设置不成功(动态图片变成静态图片),下面我来讲讲我遇到的问题以及解决方案吧。

第一个问题,报错Can't read input file!

如下:


遇到这个问题:

1.确定图片文件存在

2.确定图片文件未被占用

3.图片文件路径改成英文(不要有中文和空格)


如果再仔细检查后发现没有问题可以试试改编码类型,看看是不是编码的问题(因为我当时的编码是GBK,我改成UTF-8以后就可以运行了,但是会变成静态图片,还是会出现错误,这个问提下面会提到)。如果编码没有问题或者编码改了以后仍然报错,可以试试下面的方法


public class Main {

   public static void main(String[] args) throws IOException {

       BufferedImage bufferedImage = ImageIO.read(new File("C:\\Users\\Shane\\Desktop\\新建 文件夹\\1.png"));

       System.out.println(bufferedImage);

   }

}

这样测试以后,不管路径怎样都可以正常输出

BufferedImage@4769b07b: type = 5 ColorModel: #pixelBits = 24 numComponents = 3 color space = java.awt.color.ICC_ColorSpace@cc34f4d transparency = 1 has alpha = false isAlphaPre = false ByteInterleavedRaster: width = 538 height = 330 #numDataElements 3 dataOff[0] = 2

只有一种情况会报这个错误

就是在路径中包含中文的时候,Java源文件进行编码转换以后,再次执行,就报这个错误;

此时把编译生成的class文件删除,重新编译,就又可以了

上述是编码的问题,现在说一下报错的内部类问题,下面是代码的

关键就是下图的代码返回了false

再往下就是native方法了

所以这种情况就应该是IO流异常

第一个问题解决了,现在看一下第二个问题,将背景设置为动态,但是没有成功,设置出来的背景图还是静态的,代码示例如下:

运行结果如下:

这种问题就是图片分辨率大小不一致,导致动图被拉伸,无法展示出相应的效果,这种问题只需要在设置面板宽和高时用下面两个方法获取动图的长和宽来设置面板就可以达到效果了


int width = icon.getIconWidth();


int height = icon.getIconHeight();  


下面展示完整代码及运行结果


import javax.swing.*;

import java.awt.*;

public class Main {

   public static void main(String[] args) {

       // 背景图片

       ImageIcon icon = new ImageIcon("C:\\Users\\Shane\\Desktop\\bg.gif");

       // 宽

       int width = icon.getIconWidth();

       // 高

       int height = icon.getIconHeight();

       // JFrame

       JFrame jf = new JFrame("测试GIF背景图片");

       // 设置窗口尺寸

       jf.setSize(width, height);

       // 设置窗口居中

       jf.setLocationRelativeTo(null);

       // 设置点击关闭按钮时退出

       jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

       // 1.分层面板

       JLayeredPane layeredPane = new JLayeredPane();

       // 2.背景图片面板

       JPanel bgPanel = new JPanel();

       // 设置面板流式布局

       bgPanel.setLayout(new FlowLayout());

       // 把图片添加到标签中

       JLabel label = new JLabel(icon);

       // 设置尺寸

       bgPanel.setBounds(0, 0, width, height);

       // 添加标签

       bgPanel.add(label);

       // 3.按钮面板

       JPanel panel = new JPanel();

       // 设置面板流式布局

       panel.setLayout(new FlowLayout());

       panel.setBackground(Color.RED);

       // 面板设置为透明

       panel.setOpaque(false);

       // 测试按钮

       JButton button = new JButton("测试按钮");

       // 设置尺寸

       panel.setBounds(0, 0, width, height);

       // 面板添加测试按钮

       panel.add(button);

       // 背景图片面板添加到分层面板的低层

       layeredPane.add(bgPanel, JLayeredPane.DEFAULT_LAYER);

       // 背景图片面板添加到分层面板的高层

       layeredPane.add(panel, JLayeredPane.MODAL_LAYER);

       // 添加分层面板

       jf.setContentPane(layeredPane);

       // 设置显示窗口

       jf.setVisible(true);

   }

}

目录
相关文章
|
5月前
|
前端开发 Oracle Java
Java中的GUI应用开发技术选型
Java中的GUI应用开发技术选型
|
5月前
|
Java Apache Android开发
Java中的GUI界面设计与用户体验优化
Java中的GUI界面设计与用户体验优化
|
5月前
|
运维 监控 算法
java实现一个动态监控系统,监控接口请求超时的趋势
java实现一个动态监控系统,监控接口请求超时的趋势
267 2
|
1月前
|
开发框架 JavaScript 前端开发
HarmonyOS UI开发:掌握ArkUI(包括Java UI和JS UI)进行界面开发
【10月更文挑战第22天】随着科技发展,操作系统呈现多元化趋势。华为推出的HarmonyOS以其全场景、多设备特性备受关注。本文介绍HarmonyOS的UI开发框架ArkUI,探讨Java UI和JS UI两种开发方式。Java UI适合复杂界面开发,性能较高;JS UI适合快速开发简单界面,跨平台性好。掌握ArkUI可高效打造符合用户需求的界面。
111 8
|
4月前
|
存储 数据可视化 Java
【Java】Java swing 民宿管理系统 GUI(源码+可视化界面)【独一无二】
【Java】Java swing 民宿管理系统 GUI(源码+可视化界面)【独一无二】
|
6月前
|
前端开发 Java 开发工具
Java GUI编程:跨平台应用的设计与开发
Java GUI编程:跨平台应用的设计与开发
|
5月前
|
Java
Java中的动态类加载详解
Java中的动态类加载详解
|
5月前
|
前端开发 Java 开发工具
Java GUI编程:跨平台应用的设计与开发
Java GUI编程:跨平台应用的设计与开发
|
5月前
|
安全 Java
打破常规!JAVA反射技术让你“动态”编程
【7月更文挑战第1天】Java反射技术是动态编程的利器,它揭示了类的内部信息,允许运行时操作对象、调用方法和创建实例。动态加载类、调用方法和创建对象是其常见应用场景,但需注意反射带来的性能损失、安全风险和代码可读性下降。在平衡灵活性与效率时谨慎使用。
49 0
|
5月前
|
Java 数据安全/隐私保护 容器
Java详解:GUI容器组件 | 功能组件
Java详解:GUI容器组件 | 功能组件