[英]Why is there no image when running from a .jar file?
我正在嘗試使面板顯示圖像作為背景。 我已經可以在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);
}
}
是的,您正在嘗試將圖像作為文件讀取-請勿這樣做,因為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()));
}
}
但是請注意,資源路徑與文件路徑不同。 資源路徑相對於類文件的位置。
如果您想閱讀新圖像並將其作為背景導入,比我聰明的人已經回答了您的問題。
但是,如果您的問題與我的相似,則此幫助可能會:
如果您已經有要顯示的圖像,那么重點是從絕對路徑調用它們。 可執行類形式JAR將讀取在虛擬機內部創建的驅動器,而不是計算機中的物理驅動器。
將圖像放在短路徑文件夾中,例如
C:\\ J□\\凸出\\ IMG \\
並用絕對路徑調用它們,例如
“ C:\\\\ J \\\\ proj \\\\ img \\\\ your_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是桌面板,“ blackBoard”是桌面板。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.