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

时间:2012-05-09 15:57:26

标签: java image jar

我正在尝试将我的面板显示图像作为背景。我已经可以在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);
    }
}

2 个答案:

答案 0 :(得分:1)

是的,您尝试将图像作为文件读取 - 不要这样做,因为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()));
   }
}

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

答案 1 :(得分:0)

如果你想阅读新图片并将其作为背景导入,那么比我聪明的人已经回答了你的问题。

但是,如果你的问题与我的问题类似,那么这个帮助:

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

将图像放在短文件夹中,如

C:\ J□\凸出\ 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”就是桌面。

希望这有帮助。