这个applet很简单,关于我正在为一个类项目创建的网站中的开发者页面。我正在尝试为每个不同的JButton显示图像和生物。 我有编译问题,我一直收到NullPointerException错误 在这一行
danPic = new ImageIcon(getClass().getResource("pics/danSkaggs.jpg"));
我假设它为null因为它无法根据我给它的目录找到图像。但是我无法理解我能做些什么不同,我看不出编写目录的任何问题。目录是pics / filename.jpg,该文件夹与Java代码位于同一个包中。
以下是完整的源代码。
import java.util.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Developers extends JApplet{
private JButton danButton = new JButton("Dan Skaggs");
private JButton brandonButton = new JButton("Brandon Shaw");
private JButton jamesButton = new JButton("James Simpson");
private JLabel bioLabel = new JLabel("Please click one of the buttons on the left.");
JPanel centerPanel = new JPanel(new GridLayout(1, 2));
JPanel mainPanel = new JPanel(new BorderLayout());
JPanel westPanel = new JPanel(new GridLayout(1, 3));
private ImageIcon danPic;
private ImageIcon brandonPic;
private ImageIcon jamesPic;
private JLabel dLabel;
private JLabel bLabel;
private JLabel sLabel;
//This array carries the Bios of the group project members
String[] bio = new String[]{"Insert Bio",
"Insert Bio",
"Insert Bio"};
public Developers(){
mainPanel.add(westPanel, BorderLayout.WEST);
westPanel.add(danButton);
westPanel.add(brandonButton);
westPanel.add(jamesButton);
centerPanel.add(bioLabel);
mainPanel.add(centerPanel, BorderLayout.CENTER);
danButton.addActionListener(new Handler());
brandonButton.addActionListener(new Handler());
jamesButton.addActionListener(new Handler());
danPic = new ImageIcon(getClass().getResource("pics/danSkaggs.jpg"));
brandonPic = new ImageIcon(getClass().getResource("pics/brandonShaw.jpg"));
jamesPic = new ImageIcon(getClass().getResource("pics/jamesSimpson.jpg"));
dLabel = new JLabel (danPic);
bLabel = new JLabel (brandonPic);
sLabel = new JLabel (jamesPic);
centerPanel.add(dLabel);
add(mainPanel);
}
private class Handler implements ActionListener{
public void actionPerformed(ActionEvent event){
if(event.getSource()== danButton){
bioLabel.setText(bio[0]);
centerPanel.add(dLabel);
}
else if(event.getSource()== brandonButton){
bioLabel.setText(bio[1]);
centerPanel.add(bLabel);
}
else if(event.getSource()== jamesButton){
bioLabel.setText(bio[2]);
centerPanel.add(bLabel);
}
}
}//end Handler class
}//end Developer class
答案 0 :(得分:1)
使用ImageIO代替,它会提供您可以捕获的exception
并进行相应处理。
或者
danPic = new ImageIcon(getClass().getResource("pics/danSkaggs.jpg"));
您错过了/
,因为 pics 是包名,必须使用/
才能url
其他明智的 pics 将嵌入父 dir 名称以犯错误。所以使用(糟糕的方式)
danPic = new ImageIcon(getClass().getResource("/pics/danSkaggs.jpg"));
Exception
位于第一个,因为它首先执行更改正在获取图像的其他两个语句。
我刚测试它工作正常。
答案 1 :(得分:0)
所以getResource
正在返回null
:您的图片路径错误。请注意,这些是相对路径(相对于使用getClass
获取的类),因此您可能缺少初始斜杠,这将使其成为绝对路径。
答案 2 :(得分:0)
这应该是:
danPic = new ImageIcon(getClass().getClassLoader().getResourceAsStream("danSkaggs.jpg"));
这将从类路径加载图像,假设pics
目录位于类路径上。
答案 3 :(得分:0)
getClass().getResource("pics/danSkaggs.jpg")
是相对路径。如果您的班级位于com.mydomain
个套餐,则预计会在/com/mydomain/pics/danSkaggs.jpg
如果班级和图像在同一个包中,请使用getResource("danSkaggs.jpg")
。有关更多详细信息,请查看this comment示例代码,演示使用类或更好的类加载器加载资源。