2012-05-09 44 views
2

我想讓我的面板顯示圖像作爲背景。我已經可以在NetBeans中做到這一點,但是當我構建我的jar並運行它時,圖像不會顯示在那裏。我知道我必須以不同的方式訪問它。我看過很多教程,但其中的每一個都展示瞭如何使用ImageIcon實現,但我不需要,我只需要Image。任何人都可以指出我需要做什麼代碼?謝謝。從.jar文件運行時爲什麼沒有圖像?

這是我中背景的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); 
    } 
} 
+5

您可能試圖將圖像作爲文件而不是資源。您需要向我們展示更多信息,但我們需要充滿信心地回答。 –

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

但是請注意,資源路徑是從文件的路徑不同。資源路徑是相對於您的類文件的位置。

+0

我該怎麼做? –

+0

查看上面的代碼。但請注意,資源路徑與文件路徑不同。資源路徑是相對於您的類文件的位置。 –

+0

@RohitMalish:希望這個線程可能會幫助你:[爲你的項目加載圖片](http://stackoverflow.com/questions/9864267/load-icon-image-exception/9866659#9866659),雖然答案爲+1 :-) –

0

如果您想讀取新圖像並將其導入爲背景,比我更聰明的人已經回答了您的問題。

但是,如果你的問題是與我相似,那麼這migh幫助:

如果你已經有圖片展示,然後點是從絕對路徑調用它們。可執行類形式JAR將讀取虛擬機內創建的驅動器,而不是計算機中的物理驅動器。在短徑處理文件夾

認沽相似圖片

C:\ J□\凸出\ IMG \

,並與像

「C絕對路徑打電話給他們:\\ \\Ĵ凸出\ \(不要忘記雙反斜槓)。

(如果你不介意路徑長度,將它們留在項目包中的圖像文件夾中,並從那裏調用它們。 )

NetBeans將使用絕對路徑將它們打包到JAR中。在執行時,JRE將創建具有該路徑的JVM,從JAR中獲取圖像並將其放入該虛擬路徑。 Class將能夠找到它們,因爲它不從物理驅動器讀取路徑,而是從JVM內新創建的自己的虛擬路徑讀取路徑。

在這種情況下,避免ImageIcon只是更多的混亂,而不是更少。

您可以添加「黑板」作爲JLabel的是後臺您的JFrame,設置它的佈局爲空,這樣的事情:

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

,然後添加組件到「黑板」,而不是你的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」是桌子上的桌子。

希望這會有所幫助。

相關問題