我需要编写一个Java程序,使用PREV和NEXT JButton无限循环10个不同的图像。还有一个退出JButton退出该程序。图像需要显示在中央屏幕中。每个图像都是.jpg,存储在名为“images”的文件夹中。每个图像的文件名存储在一个数组中。这些图片的文件名与数组中的索引#s相关联(0-9)。(例如0.jpg,1.jpg等等)我的代码编译没有错误,但我的JButton都没有出现在JFrame也不是图像。在运行应用程序时,命令提示符返回:
C:\Users\Mikey\Desktop>java test
0. images/0.jpg
Exception in thread "main" java.lang.NullPointerException
at javax.swing.ImageIcon.<init>(Unknown Source)
at test.loadIcons(test.java:31)
at test.<init>(test.java:47)
at test.main(test.java:39)
这是我的代码:
import java.awt.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import java.awt.event.*;
public class test extends JFrame implements ActionListener {
private ImageIcon icon;
ImageIcon[] Pictures = new ImageIcon[10]; //array for file names
int clicks = 0; //increment by button clicks
JLabel picHolder = null;
public void loadIcons() { //begin load icons
int i;
for (i = 0; i < 10; i++) { //begin for loop
String nm = String.format("images/%d.jpg",i);
System.out.printf("%d. %s\n",i,nm);
URL imageURL = getClass().getClassLoader().getResource(nm);
icon = new ImageIcon(imageURL);
Image o = icon.getImage();
System.out.printf("%s\n",o.toString());
Pictures[i] = icon;
} //end for loop
} //end load icons
public static void main(String[] n) {
test o = new test();
}
public test() {
setSize(800,500);
setVisible(true);
setLocationRelativeTo(null);
setTitle("Mikey's Slideshow");
loadIcons(); //loods file names into array
JButton prev = new JButton("PREV");
JButton next = new JButton("NEXT");
JButton quit = new JButton("QUIT");
JPanel p_middle = new JPanel();
picHolder = new JLabel((Icon)Pictures[0]);
p_middle.add(picHolder);
p_middle.setPreferredSize(new Dimension(400,200));
JPanel p_bottom = new JPanel();
JLabel l1 = new JLabel("Go Broncos!");
p_bottom.setLayout(new BorderLayout());
p_bottom.add(quit,BorderLayout.SOUTH);
p_bottom.add(l1,BorderLayout.NORTH);
p_bottom.add(prev,BorderLayout.LINE_START);
p_bottom.add(next,BorderLayout.LINE_END);
quit.addActionListener(this);
prev.addActionListener(this);
next.addActionListener(this);
add(p_middle,BorderLayout.CENTER);
add(p_bottom,BorderLayout.SOUTH);
add(l1,BorderLayout.NORTH);
}
public void updatePic(int e) { //begin update pic
System.out.printf("%s\n",Pictures[e]);
picHolder.setIcon((Icon)Pictures[e]);
} //end update pic
public void actionPerformed(ActionEvent e) {
String a = e.getActionCommand();
if (a.equals("QUIT")) {System.exit(0);} //system exits
if (a.equals("NEXT")) {clicks++; if (clicks>9) {clicks=0;} updatePic(clicks);} //next picture
if (a.equals("PREV")) {clicks--; if (clicks<0) {clicks=9;} updatePic(clicks);} //previous picture
}
} //end class
提前谢谢!
答案 0 :(得分:0)
从堆栈跟踪中可以清楚地看出问题出在以下两行:
URL imageURL = getClass().getClassLoader().getResource(nm);
icon = new ImageIcon(imageURL);
首先,堆栈跟踪意味着imageURL
是null
。 (我们无法确定Java库行号是绝对可靠的,但没有其他合理的解释。)
那怎么可能呢?好吧,如果你查看getResource
的javadoc,你会看到如果它找不到资源,它会返回null
。因此......问题的根本原因是(至少)其中一个&#34; /images/.jpg"图像:
(资源也可能存在于应用程序的类路径中,但不存在于加载此类的类加载器的类路径中。但是,该场景有一些复杂的前提条件。)