再看java的书,照着里面的一个实例编写代码,功能是点击不同的按钮可以修改窗体左上角的图标。
但是运行代码显示错误java.lang.NullPointerException。发了提问,有人回答说是图片设置的路径有问题,我自己也做了测试,路径确实是null。
我上网查了下,自己瞎改了改,最后程序可以正常运行了。
下面是代码和我的一些想法。注释部分就是原代码,被我修改和测试的部分,大家主要看那一块就好了。
package thirdthChapter;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.Toolkit;
//import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.UIManager;
public class FrameIcon extends JFrame {
/**
*
*/
private static final long serialVersionUID = 317032021100672658L;
private JPanel contentPane;
private JButton button1;
private JButton button2;
private JButton button3;
private JButton button4;
//private BackgroundPanel backgroundPanel;
/**
* Launch the application.
*/
public static void main(String[] args) {
try {
UIManager
.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Throwable e) {
e.printStackTrace();
}
EventQueue.invokeLater(new Runnable() {
public void run(){
try {
//System.out.println("@@@@@@@@@");
FrameIcon frame = new FrameIcon();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public FrameIcon() {
setResizable(false);
setTitle("\u6307\u5B9A\u7A97\u4F53\u6807\u9898\u680F\u56FE\u6807");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 535, 348);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
System.out.println("##########");
BackgroundPanel backgroundPanel = new BackgroundPanel();
//URL resource = this.getClass().getResource("image/background.jpg");这一句就是导致无指针的罪魁
//System.out.println(resource);测试上一句有无指针的,结果返回时null。后来被我注释掉
Image image = (new ImageIcon("image/background.jpg")).getImage();//这一句本来是new ImageIcon(resource),就是上面被注释掉的resource,只这一句就可以
<span style="white-space:pre"> </span>//获得图片信息了,不知道为什么要两句代码,而且会出错了~ _ ~!
System.out.println("xxxxxxxx");
backgroundPanel.setImage(image);
contentPane.add(backgroundPanel, BorderLayout.CENTER);
JPanel panel = new JPanel();
panel.setOpaque(false);
panel.setBounds(45, 212, 447, 54);
backgroundPanel.add(panel);
button1 = new JButton("\u56FE\u68071");
button1.setIcon(new ImageIcon("image/icon1.png"));
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
do_button_actionPerformed(e);
}
});
panel.add(button1);
button2 = new JButton("\u56FE\u68072");
panel.add(button2);
button2.setIcon(new ImageIcon("image/icon2.png"));
button2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
do_button_actionPerformed(e);
}
});
button3 = new JButton("\u56FE\u68073");
panel.add(button3);
button3.setIcon(new ImageIcon("image/icon3.png"));
button3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
do_button_actionPerformed(e);
}
});
button4 = new JButton("\u56FE\u68074");
panel.add(button4);
button4.setIcon(new ImageIcon("image/icon4.png"));
button4.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
do_button_actionPerformed(e);
}
});
}
protected void do_button_actionPerformed(ActionEvent e) {
String resource = "";// 定义图标文件名称变量
//Image image = null;
if (e.getSource() == button1)
resource = "image/icon1.png";// 确定按钮对应的图标文件
if (e.getSource() == button2)
resource = "image/icon2.png";
if (e.getSource() == button3)
resource = "image/icon3.png";
if (e.getSource() == button4)
resource = "image/icon4.png";
//System.out.println("fffffffffffff");测试用
//System.out.println(resource);
//backgroundPanel.setImage(image);
//Image image = (new ImageIcon(resource)).getImage();
// backgroundPanel.setImage(image);
//URL url = this.getClass().getResource(resource);// 获取图标文件路径(这句话不知道干什么用的,但是确实是导致程序跑不通的原因)
setIconImage(Toolkit.getDefaultToolkit().getImage(resource));// 设置窗体的图标
}
}