在做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);
}
}