2012-01-16 94 views
3

我已經經歷了每一篇文章,我可以找到這個網站和Java教程,我仍然無法弄清楚爲什麼我的代碼不工作。即使我複製/粘貼其他人的代碼,它仍然不起作用。圖片將不會顯示在JLabel

我做了一個假的程序只是爲了測試這一點,並且代碼看起來像這樣:

import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JLabel; 
import javax.swing.ImageIcon; 

public class gui extends JFrame { 

    private JPanel contentPane; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        gui frame = new gui(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public gui() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 900, 700); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 

     JLabel lblNewLabel = new JLabel(new ImageIcon("bg.png")); 
     contentPane.add(lblNewLabel); 
    } 
} 

我試圖顯示,bg.png背景圖像,位於項目的根夾。我嘗試了多種格式的路徑字符串,但沒有成功。我究竟做錯了什麼?

+5

請勿使用空佈局管理器。 – mre

+0

@mre那是唯一的原因?所有其他佈局看起來很不直觀。絕對佈局更容易將事情放在gui中。有沒有辦法使這個絕對佈局的工作? – MattL922

+3

@ MattL922:這不是原因。使用空佈局管理器只是一個非常糟糕的做法。您的GUI在另一臺具有不同設置的機器上看起來很糟糕。學習使用佈局管理器。這是設計外觀良好的GUI的唯一方法。 –

回答

4

你在做什麼錯誤是,當你調用new ImageIcon("bg.png"),試圖從當前目錄加載bg.png文件。當前目錄是執行java的目錄。當前目錄可能不是您從IDE執行java時相信的目錄。

使用下面的代碼來顯示當前目錄:

File dir1 = new File ("."); 
System.out.println("current directory: " + dir1.getAbsolutePath()); 

你應該從classpath使用Class.getResource("/images/bg.png")可能加載png文件。在源目錄中創建一個images文件夾,並將該文件放入此目錄中。您的IDE會將其複製到目標文件夾以及.class文件。如果你不使用IDE,那麼你必須自己複製它。

編輯:

更多的調查後,就出現這個問題的根本原因是使用空佈局。不過,上述情況仍然存在,因爲從當前目錄加載文件不是一個好主意。

+0

這實際上最終打印出了同一個目錄我有圖像文件,但我仍然會嘗試使用Class.getResource – MattL922

+3

如果目錄是正確的,並且文件被命名爲bg.png,那麼它可能是由於您使用了null佈局,或者由於圖像太小或透明而導致您看不到它。從代碼中移除'setLayout(null)',並在構造函數的末尾調用'pack()'。 –

+0

好吧,所以我想這不是我的代碼實際上是一個問題,它只是我使用絕對佈局。任何人都可以指點我學習其他佈局的一些好資源,爲什麼絕對不是一個好的選擇? – MattL922

2

試試這個方法: -

ImageIcon icon = createImageIcon("bg.png", "image description"); 

protected ImageIcon createImageIcon(String path, String description) { 
    java.net.URL imgURL = getClass().getResource(path); 

    if (imgURL != null) { 
     return new ImageIcon(imgURL, description); 
    } else { 
     System.err.println("Couldn't find file:" +path); 
     return null; 
    } 
} 
+0

我試過這個,圖像仍然沒有顯示 – MattL922

3

您正在尋找作爲文件的圖像。當你這樣做的搜索是相對於用戶目錄的路徑,你可以得到通過

// code not tested 
System.out.println(System.getProperty("user.dir")); 

所以,你可能將不得不調整圖像的路徑,把它作爲一個文件中全部完成。另一種選擇是將其作爲Siva Charan指出的資源,在這種情況下,路徑與您的類文件的位置相關。

哦,一旦你學習和使用佈局管理器,他們變得直觀,創建和特別是維護你的GUI變得更容易。

2

只需簡單地把你的bg.png和你的gui.class文件放在一起。這將做,如果你寫的代碼

private ImageIcon getImage(String path) 
{ 
    URL url = getClass().getResource(path); 
    System.out.println(url); 
    if (url != null) 
     return (new ImageIcon(url)); 
    return null; 
} 

更多信息,請Access to Resources

這裏路徑=「bg.png」中找到;或者如果它位於某個文件夾內而不是path =「someFolder/bg.png」; 所以,你可以寫這樣的:

JLabel lblNewLabel = new JLabel(getImage("bg.png")); 
lblNewLabel.setBounds(30, 30, 100, 100); 

希望這可以幫助。

問候

0

您可能需要調試和檢查圖像文件是否正確裝入。然後,您需要檢查JLabel組件是否獲取其大小,因爲將圖像添加到JLabel不會擴展JLabel。

首先,您應該嘗試查看圖像處理程序的寬度和高度。