2

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

2 回答 2

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()));
   }
}

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

于 2012-05-09T16:20:13.270 回答
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”是上面的表格。

希望这可以帮助。

于 2017-10-08T19:53:14.303 回答