2015-03-13 130 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