如何在IntelliJ IDEA中从项目文件夹导入图片
Hey there! 针对你在IntelliJ IDEA中加载项目图片遇到的问题,我来梳理几个靠谱的资源存放方案,以及对应的加载方式,帮你避开路径坑:
项目根目录下的
resources文件夹(首推)
这是Java项目存放资源文件的标准位置,IntelliJ IDEA会自动识别这个文件夹为资源根目录,编译时会把里面的文件打包到classpath中,不管项目是本地运行还是打包成JAR,资源路径都不会出错。
你可以直接在项目根目录创建resources文件夹(如果是Maven/Gradle项目,建议用src/main/resources结构),把图片放进去后,用类加载器来加载资源:ImageIcon shades = new ImageIcon(getClass().getResource("/shades.png"));注意路径开头的
/,它代表从classpath的根目录开始查找资源。与源码同层级的资源文件夹
如果你不想单独建resources,也可以在src目录下创建比如images的文件夹来存放图片。这种情况下,加载路径要相对当前类的位置调整:// 假设ButtonDemo类在默认包下,images文件夹和src同级 ImageIcon shades = new ImageIcon(getClass().getResource("../images/shades.png"));不过这种方式不如
resources规范,项目结构复杂时容易出现路径混乱,不推荐长期使用。
你当前代码的问题说明
你现在直接用new ImageIcon("shades.png")是从当前工作目录加载文件,IntelliJ IDEA的默认工作目录是项目根目录,但如果运行配置里的工作目录被修改,或者项目打包成JAR后,这个路径就会失效。而用类加载器的方式是从classpath加载,更稳定可靠。
修改后的完整代码
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ButtonDemo extends JApplet implements ActionListener { Container cp; JLabel sunnyLabel, cloudyLabel; public void init() { cp = getContentPane(); cp.setLayout(new FlowLayout()); cp.setBackground(Color.WHITE); JButton sunnyButton = new JButton("Sunny"); cp.add(sunnyButton); sunnyButton.addActionListener(this); JButton cloudyButton = new JButton("Cloudy"); cp.add(cloudyButton); cloudyButton.addActionListener(this); // 改用类加载器加载resources目录下的图片 ImageIcon shades = new ImageIcon(getClass().getResource("/shades.png")); sunnyLabel = new JLabel("Take your shades!"); sunnyLabel.setIcon(shades); cp.add(sunnyLabel); sunnyLabel.setVisible(false); ImageIcon cloud = new ImageIcon(getClass().getResource("/cloud.png")); cloudyLabel = new JLabel("It may rain! :-D"); cloudyLabel.setIcon(cloud); cp.add(cloudyLabel); cloudyLabel.setVisible(false); } public void actionPerformed(ActionEvent e) { String ac = e.getActionCommand(); if(ac.equals("Sunny")) { cp.setBackground(Color.YELLOW); sunnyLabel.setVisible(true); cloudyLabel.setVisible(false); } else if(ac.equals("Cloudy")) { cp.setBackground(Color.GRAY); cloudyLabel.setVisible(true); sunnyLabel.setVisible(false); } else { System.out.println("Error"); } } }
额外步骤
如果是普通Java项目,创建resources文件夹后,右键点击它 → Mark Directory as → Resources Root,这样IntelliJ IDEA就会正确处理里面的资源文件,编译时自动打包到classpath中。
内容的提问来源于stack exchange,提问作者sasuke

