在Eclipse中JFrame自定义图标可以显示,但是导出JAR之后无法显示

在我的项目中,一开始我使用这种方式构造图片路径,然后将其设置到JFrame中即可以显示自定义图标
String imagePath = System.getProperty("user.dir") + "/image/icon.png";// 构造图片的路径
Image imageIcon = Toolkit.getDefaultToolkit().getImage(imagePath);
jFrame.setIconImage(imageIcon);
项目路径如下
但是在我将项目导出为JAR文件的时候,却无法显示自定义图标了,显示的仍然是咖啡杯,经过网上查找,发现如下可以解决:
String imagePath = "image/icon.png";// 构造图片的路径
Image imageIcon = Toolkit.getDefaultToolkit().getImage(getClass().getClassLoader().getResource(imagePath));// 这种写法就可以解决导出的Jar包也能显示图标了 
jFrame.setIconImage(imageIcon);
但是这样的写法有个要求,就是图片资源要放在src目录下,如下图
,经过测试,这种写法,如果还将图片放在根目录下,是行不通的。会报如下错误
at sun.awt.image.URLImageSource.getConnection(Unknown Source)
![图片说明](https://img-ask.csdn.net/upload/201904/14/1555249560_377777.jpg)![图片说明](https://img-ask.csdn.net/upload/201904/14/1555249570_781286.jpg) 我swing了一个登陆界面,在eclipse运行时显示正常,但是生成jar并运行jar后,背景不显示。 ``` public class Login extends JFrame { JPanel contentPane; JPasswordField passwordField; public static void main(String[] args) { Login frame = new Login(); } public Login() { setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(600, 300, 600, 400); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); //组件 JLabel label1 = new JLabel("\u6B22\u8FCE\u767B\u9646\u7A3B\u7530\u7EFC\u5408\u79CD\u517B\u4FE1\u606F\u670D\u52A1\u7CFB\u7EDF"); label1.setForeground(Color.BLACK); label1.setFont(new Font("微软雅黑", Font.BOLD, 30)); label1.setHorizontalAlignment(SwingConstants.CENTER); label1.setBounds(34, 51, 511, 53); contentPane.add(label1); JLabel label2 = new JLabel("\u7528\u6237\u540D"); label2.setFont(new Font("宋体", Font.PLAIN, 20)); label2.setForeground(Color.BLACK); label2.setHorizontalAlignment(SwingConstants.CENTER); label2.setBounds(77, 136, 72, 32); contentPane.add(label2); JLabel label3 = new JLabel("\u5BC6\u7801"); label3.setForeground(Color.BLACK); label3.setFont(new Font("宋体", Font.PLAIN, 20)); label3.setHorizontalAlignment(SwingConstants.CENTER); label3.setBounds(77, 208, 72, 32); contentPane.add(label3); setVisible(true); setTitle("登陆"); //登陆界面布局 JButton button1=new JButton("登陆"); button1.setBounds(147, 284, 113, 27); contentPane.add(button1); JTextField textField=new JTextField(); textField.setBounds(177, 140, 302, 24); contentPane.add(textField); textField.setFont(new Font("宋体",Font.PLAIN,20)); textField.setColumns(10); JPasswordField passwordField=new JPasswordField(); passwordField.setBounds(177, 214, 302, 24); passwordField.setFont(new Font("宋体",Font.PLAIN,20)); contentPane.add(passwordField); JButton button2 = new JButton("清除"); button2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { textField.setText(""); passwordField.setText(""); } }); button2.setBounds(330, 284, 113, 27); contentPane.add(button2); //设置背景 ImageIcon imageIcon=new ImageIcon("src/picture/1.jpg"); JLabel label=new JLabel(imageIcon); label.setBounds(0, 0, imageIcon.getIconWidth(), imageIcon.getIconHeight()); getLayeredPane().add(label,new Integer(Integer.MIN_VALUE)); JPanel panel=(JPanel)getContentPane(); panel.setOpaque(false); JPanel panel2=new JPanel(); panel2.setOpaque(false); panel2.setLayout(null); //登陆功能 textField.setText("admin"); passwordField.setText("123"); button1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String str=textField.getText(); char ch[]=passwordField.getPassword(); String pass=new String(ch); /* boolean bool1= str=="admin"; boolean bool2= pass=="123"; System.out.println(bool1); System.out.println(bool2); */ if (str.equals("admin") && pass.equals("123") ){ mainpage p=new mainpage(); dispose(); } else { JOptionPane.showMessageDialog(null, "用户名或密码错误!","登陆失败!",JOptionPane.PLAIN_MESSAGE); } } }); } } ```
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页