2015-03-13 129 views
0

我有一個程序,當程序在系統托盤中顯示圖標時。我使用下面的代碼在系統托盤區顯示圖標:系統托盤圖像未加載java

public static void showTrayIcon() { 
     if (java.awt.SystemTray.isSupported()) { 
      st = java.awt.SystemTray.getSystemTray(); 

      image = Toolkit.getDefaultToolkit().getImage(PongeeUtil.class.getClass().getResource("export.png")); 



      ActionListener listener = new ActionListener() { 

       public void actionPerformed(ActionEvent e) { 
        JOptionPane.showMessageDialog(null, "Hello"); 
       } 
      }; 

      PopupMenu popup = new PopupMenu(); 

      MenuItem defaultItem = new MenuItem("sdf"); 
      defaultItem.addActionListener(listener); 
      popup.add(defaultItem); 

      trayIcon = new TrayIcon(image, "Tray Demo", popup); 

      trayIcon.addActionListener(listener); 
      try { 
       st.add(trayIcon); 

      } catch (AWTException e) { 
       System.err.println(e); 
      } 
     } 
    } 

當我打電話,我main()這個方法我在系統托盤中得到的東西,但圖標丟失。我認爲圖像無法加載。圖像位於我的java文件所在的相同包中。

我在這裏做錯了什麼?

+1

哪裏是'export.png'位於範圍內來源?考慮使用'ImageIO.read'來加載圖像,當它無法加載時會引發錯誤。請參閱[閱讀/加載圖像](http://docs.oracle.com/javase/tutorial/2d/images/loadimage.html)以獲取更多詳細信息 – MadProgrammer 2015-03-13 07:21:17

+0

圖像與我的java文件位於同一個包中。 – 2015-03-13 07:24:39

回答

2

圖像是在同一個包在我的Java文件是

如果你看一看的JavaDoc Toolkit#getImage你會發現,它說...

返回一個從獲得指定文件的像素數據的圖像

這是重要。你也應該知道getImage加載物理圖像在後臺線程,這意味着如果它無法加載圖像,它會默默地做...

好吧。核心問題是,一旦圖像被放置在應用程序的上下文中(使用類文件),它就會變成,通常被稱爲嵌入式資源。

無法通過任何需要訪問文件系統上的文件的方式加載這些資源。

相反,你需要使用Class#getResourceClass#getResourceAsStream加載它們,例如

image = Toolkit.getDefaultToolkit().getImage(YourClass.class.getResource("/package/path/to/classes/export.png")); 

或者更preferabbly ...

BufferedImage img = ImageIO.read(YourClass.class.getResource("/package/path/to/classes/export.png")); 
image = new ImageIcon(img); 

ImageIO將拋出IOException當它不能加載圖像出於某種原因,它給你更多的診斷信息來解決問題

nb:

  • YourClass是你類,它包含了showTrayIcon方法...
  • /package/path/to/classes是圖像存儲於其中的包的名稱...
+0

我使用Class#getResource加載圖像,但沒有圖像。請參閱我的編輯 – 2015-03-13 07:38:23

+0

類和圖像所在的包名稱是什麼? – MadProgrammer 2015-03-13 07:39:09

+0

而你只需要'PongeeUtil.class.getResource' – MadProgrammer 2015-03-13 07:39:30