簡體   English   中英

從.jar文件運行時,為什么沒有圖像?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM