【问题标题】:Why can't my java swing action find my image in src/main/resources?为什么我的 java swing 动作在 src/main/resources 中找不到我的图像?
【发布时间】:2018-02-09 17:19:57
【问题描述】:

我为浏览按钮下载了一张图片。我把它放在我的 maven 项目的 src/main/resources 文件夹中。在我的浏览操作中,这是我的课程代码:

package net.draconia.testcopier.ui.actions;

import java.awt.event.ActionEvent;
import java.net.URL;

import javax.swing.AbstractAction;
import javax.swing.ImageIcon;

import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;

import net.draconia.testcopier.TestCopierController;

@Component
public class Browse extends AbstractAction
{
    private static final long serialVersionUID = 6237458116383473511L;

    private TestCopierController mObjController;

    public Browse(final TestCopierController objController)
    {
        super();

        URL objURL = Browse.class.getResource("./if_8_27829.png");

        putValue(SMALL_ICON, new ImageIcon(objURL));

        setController(objController);

    }

    public void actionPerformed(final ActionEvent objActionEvent)
    {
        getController().browseForBackupFolder();
    }

    protected TestCopierController getController()
    {
        return(mObjController);
    }

    protected void setController(final TestCopierController objController)
    {
        mObjController = objController;
    }
}

问题是,当我尝试通过 Browse.class.getResource(...) 访问图像时,我在构造函数中得到了一个空值。我已经尝试在文件名之前使用“./”并且没有它 - 也只是裸文件名,我得到了相同的结果。这是我的 pom 文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>net.draconia</groupId>
    <artifactId>reedelseviertestcopier</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Reed Elsevier Test Copier</name>

    <properties>
        spring.version>4.3.2.RELEASE</spring.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
                <excludes>
                    <exclude>**/*.java</exclude>
                </excludes>
            </resource>
        </resources>
    </build>
</project>

我不知道错误是否在我的 pom 文件中,为什么在 eclipse 中我无法看到图像。我正要尝试实现我的项目以生成一个可执行的 jar,以便我可以尝试在命令行中运行它以生成输出窗口等,但我认为它至少应该在 eclipse 中工作,你知道吗?有什么想法吗?

【问题讨论】:

标签: java eclipse swing maven


【解决方案1】:

Class.getResource() 搜索 CLASSPATH。在此之前,它将根据您传入的值构造要使用的绝对资源名称:

  • 如果名称以“/”开头(“\u002f”),则资源的绝对名称是名称中“/”后面的部分。
  • 否则,绝对名称的格式如下:

    modified_pa​​ckage_name/name

    modified_pa​​ckage_name 是这个对象的包名,用 '/' 代替了 '.' ('\u002e')。

所以当您调用Browse.class.getResource("if_8_27829.png") 时,会在CLASSPATH 中搜索不存在的/net/draconia/testcopier/ui/actions/if_8_27829.png

您需要调用Browse.class.getResource("/if_8_27829.png") 并确保在您的程序运行时src/main/resources 在CLASSPATH 中。 (我不熟悉maven,所以我不知道它是如何管理的)

【讨论】:

  • 漂亮!有效!我将其更改为 /if_8_27829.png 并且不再为空。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 2021-04-23
  • 1970-01-01
相关资源
最近更新 更多