我正在尝试将我的面板显示图像作为背景。我已经可以在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);
}
}
答案 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”就是桌面。
希望这有帮助。