Java 为什么从.jar文件运行时没有映像?

Java 为什么从.jar文件运行时没有映像?,java,image,jar,Java,Image,Jar,我试图使我的面板显示图像作为背景。我已经可以在NetBeans中做到这一点,但当我构建jar并运行它时,映像不会显示在那里。我知道我必须以不同的方式访问它。我看过很多教程,但每一个都展示了如何使用ImageIcon,但我不需要,我只需要图像。有人能指出我需要哪段代码来完成这项工作吗?谢谢 这是我为背景JPanel编写的代码: public class JPanelWB extends JPanel { // Creates JPanel with given image as backgroun

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

这是我为背景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);
    }
}

是的,您试图以文件的形式读入图像--不要这样做,因为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()));
   }
}

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

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

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

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

将图像放入短路径文件夹,如

C:\J\proj\img\

并用绝对路径调用它们,如

“C:\\J\\proj\\img\\your\u image.png//(不要忘记双反斜杠。)

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

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是桌板,“黑板”是桌板


希望这有帮助。

您可以尝试将图像作为文件而不是资源获取。您需要向我们展示更多信息,以便我们有信心地回答这个问题。编辑了我的帖子,现在包含代码请参见上面的代码。但请注意,资源路径不同于文件路径。资源路径与类文件的位置相对。@RohitMalish:希望此线程可以帮助您:,+1获得答案:-)因此如果my image.jpg位于默认包中,如“src/image.jpg”在我构建了我的项目之后,它的资源路径是什么?我发现自己:)创建了新的包,并将我的映像移动到了mypackage/image.jpg路径之后。感谢您提供的解决方案:)@RohitMalish:当您访问资源文件夹时,总是使用正斜杠
/
。因此,资源文件夹中的任何内容都将被访问,访问方式如下
getClass().getResource(“/image/myImage.extension”)
。在我提供的链接中,我也添加了一些关于如何将图像添加到NetBeans的内容,请再次查看:-)