以下是学习过程中,书上的实例代码,博主对着敲了一遍却无法运行。
import java.awt.*;
import java.net.URL;
import javax.swing.*;
public class SwingAndThread extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
private JLabel jl = new JLabel(); // 声明JLabel对象
private static Thread t; // 声明线程对象
private int count = 0; // 声明计数变量
private Container container = getContentPane(); // 声明容器
public SwingAndThread() {
setBounds(300, 200, 250, 100); // 绝对定位窗体大小与位置
container.setLayout(null); // 使窗体不使用任何布局管理器
URL url = SwingAndThread.class.getResource("/1.gif"); // 获取图片的URL
Icon icon = new ImageIcon(url); // 实例化一个Icon
jl.setIcon(icon); // 将图标放置在标签中
// 设置图片在标签的最左方
jl.setHorizontalAlignment(SwingConstants.LEFT);
jl.setBounds(10, 10, 200, 50); // 设置标签的位置与大小
jl.setOpaque(true);
t = new Thread(new Runnable() { // 定义匿名内部类,该类实现Runnable接口
public void run() { // 重写run()方法
while (count <= 200) { // 设置循环条件
// 将标签的横坐标用变量表示
jl.setBounds(count, 10, 200, 50);
try {
Thread.sleep(1000); // 使线程休眠1000毫秒
} catch (Exception e) {
e.printStackTrace();
}
count += 4; // 使横坐标每次增加4
if (count == 200) {
// 当图标到达标签的最右边,使其回到标签最左边
count = 10;
}
}
}
});
t.start(); // 启动线程
container.add(jl); // 将标签添加到容器中
setVisible(true); // 使窗体可视
// 设置窗体的关闭方式
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
public static void main(String[] args) {
new SwingAndThread(); // 实例化一个SwingAndThread对象
}
}
报错信息如下:
Exception in thread "main" java.lang.NullPointerException
at java.desktop/javax.swing.ImageIcon.<init>(ImageIcon.java:217)
at SwingAndThread.<init>(SwingAndThread.java:19)
at SwingAndThread.main(SwingAndThread.java:51)
但是却可以通过命令行成功运行:
原因在于:
URL url = SwingAndThread.class.getResource("/1.gif"); // 获取图片的URL
观察项目文件夹的目录如上图,有一个src目录,这是JAVA源文件的目录,有一个bin目录,这是JAVA编译后文件(.class文件等)的存放目录。
解决方案如下图 :
即在bin文件夹中添加该图片文件。
你想添加图片的URL,你得从最终生成的.class文件为着手点,不要以.java文件的路径为出发点,因为真正使用的就是.class,不会拿个.java文件就使用,因为java是编译型语言。
所以当我们想要使用getResource()方法时,就只好把文件放在.class文件相同目录下或者它的父目录中了。
或者,直接用绝对路径,不用getResource()方法,但是使用绝对路径,有违java一次编译,处处运行的精神