【问题标题】:Why is there no image when running from a .jar file?为什么从 .jar 文件运行时没有图像?
【发布时间】:2012-05-18 04:21:18
【问题描述】:

我正在尝试让我的面板显示图像作为背景。我已经可以在 NetBeans 中做到这一点,但是当我构建我的 jar 并运行它时,图像并没有显示在那里。我知道我必须以不同的方式访问它。我看过很多教程,但每个教程都展示了如何使用 ImageIcon 来完成,但我不需要那个,我只需要 Image。谁能指出我需要哪段代码来做到这一点?谢谢。

这是我的后台 JPanel 代码:

public class JPanelWB extends JPanel { // Creates JPanel with given image as background.

    private Image backgroundImage;

    public JPanelWB(String fileName){
        try {
            backgroundImage = ImageIO.read(new File(fileName));
        } catch (IOException ex) {
            new JDialog().add(new Label("Could not open image."+ex.getMessage()));
        }
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        // Draw the background image.
        g.drawImage(backgroundImage, 0, 0, getWidth(),getHeight(),this);
    }
}

【问题讨论】:

  • 您可能试图将图像作为文件而不是作为资源获取。不过,您需要向我们展示更多信息,以便我们自信地回答这个问题。
  • 编辑了我的帖子,现在包含在代码中

标签: java image jar


【解决方案1】:

如果您想读取新图像并将其作为背景导入,比我聪明的人已经回答了您的问题。

但是,如果您的问题与我的类似,那么这可能会有所帮助:

如果您已经有图像要显示,那么关键是从绝对路径调用它们。可执行类形式的 JAR 将读取在虚拟机中创建的驱动器,而不是您计算机中的物理驱动器。

将图片放在短路径文件夹中

C:\J\proj\img\

并用绝对路径调用它们

"C:\\J\\proj\\img\\your_image.png" //(不要忘记双反斜杠。)

(如果您不介意路径长度,请将它们放在项目包内的图像文件夹中,然后从那里调用它们。)

NetBeans 会将它们打包到具有绝对路径的 JAR 中。在执行时,JRE 将在其中创建包含该路径的 JVM,从 JAR 中获取图像并将它们放入该虚拟路径。类将能够找到它们,因为它不是从物理驱动器读取路径,而是从自己在 JVM 中新创建的虚拟驱动器读取路径。

在这种情况下,避免使用 ImageIcon 只会更混乱,而不是更少。

您可以将“blackBoard”作为 JLabel 添加为 JFrame 的背景,将其布局设置为 null,如下所示:

    private JLabel blackBoard;
    private JLabel noteToSelf;
    //.....
    blackBoard = new JLabel();
    noteToSelf = new JLabel();
    //.....

    // putting JLabel "blackBoard" as background into JFrame
    blackBoard.setIcon(new ImageIcon("c:\\Java\\images\\MarbleTable.png"));
    getContentPane().add(blackBoard);
    blackBoard.setBounds(1, 1, 400, 440);
    blackBoard.setLayout(null);

然后将组件添加到“blackBoard”而不是您的 JFrame,就像这样。

    // putting JLabel "noteToSelf" onto background
    noteToSelf.setIcon(new ImageIcon("c:\\Java\\images\\Sticker_a1.png"));
    // or:  noteToSelf.setText("Remind me at 6:30am...");
    blackBoard.add(noteToSelf);
    noteToSelf.setBounds(noteX, noteY, 64, 48);

现在您的 JFrame 是桌面板,“blackBoard”是上面的表格。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    是的,您正在尝试将图像作为文件读取——不要这样做,因为文件不存在于 Jar 文件中。而是将其作为资源读入。

    类似这样的:

    public JPanelWB(String resourceName){
       try {
           // backgroundImage = ImageIO.read(new File(resourceName));
          backgroundImage = ImageIO.read(getClass().getResource(resourceName));
       } catch (IOException ex) {
           new JDialog().add(new Label("Could not open image."+ex.getMessage()));
       }
    }
    

    但请注意,资源路径与文件路径不同。资源路径是相对于你的类文件的位置。

    【讨论】:

    • 见上面的代码。但请注意,资源路径与文件路径不同。资源路径是相对于你的类文件的位置。
    • @RohitMalish :希望这个线程可以帮助你:Loading Images for your Project,+1 答案虽然 :-)
    • 所以如果我的 image.jpg 位于默认包中,比如“src/image.jpg”,那么在我构建项目后,资源路径是什么?
    • 发现了自己 :) 创建了新包并将我的图像移到该路径为 mypackage/image.jpg 之后。感谢您的解决方案:)
    • @RohitMalish :当您访问资源文件夹时,您总是使用正斜杠 /。因此,您的资源文件夹中的任何内容都将被访问,例如getClass().getResource("/image/myImage.extension")。在我提供的那个链接中,我也添加了有关如何将图像添加到 NetBeans 的内容,请再次查看 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多