如何在Eclipse中为我的Java项目添加资源文件夹

57

我希望有一个地方来存储我的图像文件,以便在我的Java项目中使用(一个非常简单的类,只是将图像加载到面板上)。我已经到处寻找,但找不到如何做到这一点。我该如何做呢?

我尝试添加一个新文件夹到项目中,添加一个新的类文件夹到项目中,以及添加一个新的源文件夹到项目中。无论我做什么,我总是得到一个IOException。这些文件夹总是说它们在构建路径上,所以我不知道该怎么办。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PracticeFrame extends JFrame{

private static BufferedImage image;
Thread thread;

public PracticeFrame() {
    super();
    setPreferredSize(new Dimension(640,480));
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack();
    setVisible(true);
}

public static void main (String[] args) {
    PracticeFrame pframe = new PracticeFrame();
    try {
        image = ImageIO.read(new File("/islands.png"));
    } catch (IOException e) {
        e.printStackTrace();
    }

    JPanel panel = new JPanel() {
        @Override
        protected void  paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image,0,0,null);
        }
    };

    panel.setBackground(Color.BLUE);
    panel.repaint();
    pframe.add(panel);


}


}

编辑:对我有效的一种方法,我不知道为什么,是将main/res/文件夹添加为类文件夹,然后再将其删除。当/main/res/作为类文件夹的一部分并且构建路径时,我运行它仍然无法正常工作。当我添加它时,弹出一个告诉我某些内容已排除的筛选器的窗口。但当我从构建路径中的库中删除文件夹并将文件路径更改为:

image = ImageIO.read(new File("src/main/res/islands.png"));

至少我不再出现IOException异常了。我可能没有正确地将图像添加到面板中,因为它没有显示出来,但至少它找到了这个文件(我想)。


展示产生异常的代码。你可能指定了错误的路径。 - PM 77-1
@PM77-1 这是我用于添加 res 文件夹的每种不同方式所使用的代码。 - redeagle47
请发布您的项目目录结构,并告诉我们您想要 .class 文件的目标位置。 - PM 77-1
我现在已经设置好了一切:workspace/JFramePractice/src/main/res/islands.png我的.class文件在这里:workspace/JFramePractice/bin/*.class - redeagle47
右击项目 > 新建 > 源文件夹 - vinsinraw
8个回答

80

在“添加资源文件夹”选项卡中,依次选择 “构建路径” -> “配置构建路径” -> “源”(选项卡) -> “添加文件夹” -> “创建新文件夹” enter image description here

在新创建的文件夹中添加“my-resource.txt”文件。 然后在您的代码中:

    InputStream res =
    Main.class.getResourceAsStream("/my-resource.txt");

    BufferedReader reader =
        new BufferedReader(new InputStreamReader(res));
    String line = null;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
    reader.close();

3
我认为这是正确的答案,作者真的不知道如何向项目中添加资源。他需要知道如何从代码中打开它。 - Lautaro Cozzani
你应该添加更多信息。请解释一下原帖作者做错了什么以及为什么(尤其是如何),你的代码如何解决这个问题。 - Julian F. Weinert
1
好的,在原始示例中,readagle 尝试使用 File 类打开文件,然后您必须提供一个路径,该路径从可执行文件运行开始,无论是否为资源。 如果您使用 getResourceAsStream() 打开资源,则将从项目资源文件夹中打开它。 - Lautaro Cozzani
2
太棒了,现在请编辑您的帖子并将信息放在那里;-) - Julian F. Weinert
getClass().getResource("/file.txt") 对我来说已经起作用了。 - Bahadir Tasdemir
显示剩余5条评论

16
为了回答您在标题中提出的问题...
步骤1--> 右键单击Java项目,选择选项"属性" 步骤1--> 右键单击Java项目,选择选项"属性" 步骤2--> 从左侧菜单中选择"Java Build Path",确保您在"源"选项卡上,然后点击"添加文件夹" 从左侧菜单中选择"Java Build Path",确保您在"源"选项卡上,然后点击"添加文件夹" 步骤3--> 点击窗口底部的"创建新文件夹..."选项 点击窗口底部的"创建新文件夹..."选项 步骤4--> 将新文件夹命名为"resources",然后单击"完成" 将新文件夹命名为"resources",然后单击"完成" 步骤5--> 现在您将能够在Java项目下看到新创建的"resources"文件夹,单击"确定",再次单击"确定"
现在您应该能够在Java项目下看到新创建的文件夹“resources”,点击“确定”,再次点击“确定”

最后一步--> 现在您应该能够在Java项目下看到新的文件夹“resources”
现在您应该能够在Java项目下看到新的文件夹“resources”


11
它被设置为SOURCE文件夹,而不是RESOURCE文件夹。这不是问题的答案。 - Gangnus

6

路径建立 -> 配置构建路径 -> 库(选项卡) -> 添加类文件夹,然后选择您的文件夹或创建一个。


2
这个答案对我有用!以上所有答案都不起作用!其他任何主题中的答案也都不起作用! - FriskySaga

4
在添加资源文件夹后,请尝试执行以下操作:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("test.png");

try {
    image = ImageIO.read(input);
} catch (IOException e) {
    e.printStackTrace();
}

1

右键点击项目 > 点击属性 > Java构建路径 > 源 > 添加文件夹


1
如果您有多个子项目,则需要将资源文件夹添加到每个项目的运行配置类路径中,如下所示:

class path

确保新路径在条目的顶部,然后运行时将首先检查该路径是否有任何资源(在检查子路径之前)。


1
如果目标是在src/main/java文件夹相对应的位置创建一个resources文件夹,则需要执行以下步骤:
Right Click on your project > New > Source Folder
Provide Folder Name as src/main/resources
Finish

-1

尝试给出完整的路径来读取图像。

例如:image = ImageIO.read(new File("D:/work1/Jan14Stackoverflow/src/Strawberry.jpg"));

在给出完整路径后,您的代码没有产生任何异常。如果您只想在Java代码中读取图像文件,请参考以下内容 - http://docs.oracle.com/javase/tutorial/2d/images/examples/LoadImageApp.java

如果您的类对象是在代码末尾创建的,则您的代码对我来说可以正常工作并显示图像。

// PracticeFrame pframe = new PracticeFrame();//comment this

new PracticeFrame().add(panel);

在结尾处初始化你的类。 - jones j alapat
new PracticeFrame().add(panel); 新的PracticeFrame().add(panel); - jones j alapat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接