2013-07-17 79 views
0

我一直在尋找互聯網試圖找出如何添加一個圖標圖像到我的JFrame,但我不斷收到錯誤。我知道這已被問到堆棧溢出,但解決方案不適合我。這裏是我的代碼:JFrame圖標圖像不工作

ImageIcon imageIcon = new ImageIcon("src/slime.png"); 
    ImageIcon image = new ImageIcon("src/slime.gif"); 

    JLabel label = new JLabel(image, JLabel.CENTER); 
    label.setAlignmentX(0); 
    label.setAlignmentY(0); 
    label.setIcon(image); 

    JFrame window = new JFrame("Slime"); 
    window.setVisible(true); 
    window.setSize(250, 200); 
    window.setResizable(false); 
    window.setIconImage(newImageIcon(getClass().getResource("src/slime.png")).getImage()); 
    window.add(label); 

以下是錯誤我得到: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at javax.swing.ImageIcon.<init>(ImageIcon.java:205) at MainJFrame.<init>(MainJFrame.java:39) at MainJFrame$1.run(MainJFrame.java:18) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:727) at java.awt.EventQueue.access$200(EventQueue.java:103) at java.awt.EventQueue$3.run(EventQueue.java:688) at java.awt.EventQueue$3.run(EventQueue.java:686) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:697) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

幫助將是非常讚賞。注意:我試過window.setIconImage(imageIcon.getImage());但這不起作用,並使我在屏幕上打印的其他圖像消失。

+0

發生了什麼錯誤? – Vulcan

+0

你能在這裏粘貼你的錯誤嗎? – kukis

+0

那麼當我嘗試window.setIconImage(ImageIO.read(「src/slime.png」));我得到錯誤類型ImageIO中的方法read(File)不適用於參數(字符串) – Cj1m

回答

0

使用getClass來獲得圖像:

window.setIconImage(new ImageIcon(
       getClass().getResource("src/slime.png")).getImage()); 

但是如果你想將圖像添加到您的標籤的則標籤添加到您的框架使用這個代替:

Image img = (new ImageIcon(getClass().getResource("src/slime.png"))).getImage(); 
JLabel lblIcon = new JLabel(new ImageIcon(newimg)); 
window.add(lblIcon); 

,如果你想要將圖像大小調整爲窗口大小,請執行以下操作(將代碼添加到窗口之前):

Image newimg = img.getScaledInstance(window.getWidth() , window.getHeight(), java.awt.Image.SCALE_SMOOTH);// resizing image to the window size 

編輯:

當然你不能在getClass()方法public static void main()使用你應該把你的代碼某處non-static像類構造函數的例子。

public class MainForm extends javax.swing.JFrame { 

/** 
* Creates new form MainForm 
*/ 
public MainForm() { 
    //put your code here... 
    window.setIconImage(new ImageIcon(
      getClass().getResource("src/slime.png")).getImage()); 
} 
public static void main(String args[]) { 
    /* Create and display the form */ 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
       new MainForm().setVisible(true); 
      } 
     }); 
    } 

try-catch塊總是好的,以檢查您是否正確地獲取圖像。儘管在這種情況下,當你從軟件包中獲取代碼時並不是必須的,但是如果你要從項目之外獲得任何資源,請確保你的開放過程。

+0

錯誤:無法從類型Object – Cj1m

+0

@ user1952565對非靜態方法getClass()進行靜態引用,從'static main'中移除您的代碼並將它們放入另一個類中,並從中創建一個實例。 – sajjadG

+0

什麼是一個實例? – Cj1m

0

試試這個。與sajjad的答案相同,只是在使用之前檢查圖像url是否爲空。

java.net.URL imageUrl = YourClass.class.getResource("/IconImage.png"); 
if(imgUrl != null){ 
    setIconImage(new ImageIcon(imageUrl).getImage()); 
} 
0

試試這個,它有工作

frame.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/src/slime.gif"))); 

你寫,

newImageIcon() 

,因爲它爲您編制這可能是一個方法。我想你可能不得不把它寫成new ImageIcon()這可能是問題所在。 javax.swing.ImageIcon未被創建。

簡單地說,你爲什麼不使用

setIconImage(imageIcon.getImage()); 

下面是完整的代碼,

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
class IconImageDemo1 extends JFrame 
{ 

    public IconImageDemo1() 
    { 
     createAndShowGUI(); 
    } 

    private void createAndShowGUI() 
    { 
     setTitle("IconImage Demo"); 
     setLayout(new FlowLayout()); 
     setSize(400,400); 
     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


     setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("icons/camera.png"))); 

     setLocationRelativeTo(null); 
    } 

    public static void main(String args[]) 
    { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() 
      { 
       new IconImageDemo1(); 
      } 
     }); 
    } 
} 
+0

無法使靜態引用類型爲Object的非靜態方法getClass() – Cj1m

+0

所有組件均默認爲流佈局。 –

0

首先,只是爲了安全起見,不要試着讓你的JFrame在你的主要方法。這就是爲什麼你從某些解決方案中獲得一些靜態錯誤的原因。在我看來,靜態只是一個很大的問題,因爲只要你使靜態變爲靜態,你就可以將它們全部靜態化。嘗試並在構造函數中初始化JFrame而不是主要方法。只是要在main方法的新MainJFrame對象:

public static void main(String[] args){ 
    MainJFrame frame = new MainJFrame(); 
} 

並把所有的代碼在構造函數中,如果你不知道這是什麼,你應該知道,那麼這是一個什麼樣子:

public MainJFrame(){ 
    //This is a constructor 
    //All frame init code in here 
} 

然後把同樣的代碼在那裏,但把newImageIcon之間的空間,在你setIconImage()論點。因此,整個構造函數應該看起來像這樣:

public MainJFrame(){ 
    ImageIcon imageIcon = new ImageIcon("src/slime.png"); 
    ImageIcon image = new ImageIcon("src/slime.gif"); 

    JLabel label = new JLabel(image, JLabel.CENTER); 
    label.setAlignmentX(0); 
    label.setAlignmentY(0); 
    label.setIcon(image); 

    JFrame window = new JFrame("Slime"); 
    window.setVisible(true); 
    window.setSize(250, 200); 
    window.setResizable(false); 
    window.setIconImage(new ImageIcon(getClass().getResource("src/slime.png")).getImage()); 
    window.add(label); } 

如果仍然不起作用,則嘗試使用ImageIO加載圖像。這不適用於小程序,因爲它會給你一個安全錯誤。

window.setIconImage(ImageIO.read(new File("folder/to/file.png"))); 

您還需要圍繞這條線在一拋/ catch塊,如果你是在Eclipse中工作,那麼要確保該文件的文件夾中的主要包之外。除此之外,你應該很好。