【问题标题】:Tray icon simply not showing in java托盘图标根本没有在java中显示
【发布时间】:2015-06-25 15:36:26
【问题描述】:

我整天都在尝试添加我的托盘图标,但它不起作用。我将图标文件存储在 netbeans src/myproject/

我尝试了无数种不同的路径,甚至是直接指向我的文件的路径,但似乎都没有。我很确定我的代码中的某些内容不起作用,我根本看不到它。

public void createSystemTrayIcon() {

if (SystemTray.isSupported()) {
    SystemTray tray = SystemTray.getSystemTray();
    Image img = Toolkit.getDefaultToolkit().getImage("smallicon.ico");

    PopupMenu popup = new PopupMenu();

    final MenuItem menuExit = new MenuItem("Quit");

    MouseListener mouseListener =
        new MouseListener() {
        public void mouseClicked(MouseEvent e) {
            show();
        }

        public void mouseEntered(MouseEvent e) {
        }

        public void mouseExited(MouseEvent e) {
        }

        public void mousePressed(MouseEvent e) {
        }

        public void mouseReleased(MouseEvent e) {
        }
    };

    ActionListener exitListener =
        new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Runtime r = Runtime.getRuntime();
            System.out.println("Exiting...");
            r.exit(0);
        }
    };

    menuExit.addActionListener(exitListener);
    popup.add(menuExit);

    final TrayIcon trayIcon = new TrayIcon(img, "ESOLeaderboards", popup);

    ActionListener actionListener =
        new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                trayIcon.displayMessage("ESOLeaderboards ","version: EU 1.0",
                        TrayIcon.MessageType.INFO);
        }
    };

    trayIcon.setImageAutoSize(true);
    trayIcon.addActionListener(actionListener);
    trayIcon.addMouseListener(mouseListener);

    try {
        tray.add(trayIcon);
    } catch (AWTException e) {
        System.err.println("TrayIcon could not be added.");
    }

} else {
    //  System Tray is not supported
}

}

【问题讨论】:

  • 你是否得到了一个“空白”空间,图标应该出现在哪里,或者什么都没有表明应该放置一个图标?
  • 一个空白,它在那里,空白只是空白
  • 首先确保您确实从工具包中获得了有效图像。 Toolkit 不支持 AFAIK .ico。我会先尝试使用 png。
  • @Woeler,您的确切代码适用于我的 png 图像...我希望您不只是将 .ico 重命名为 .png...只是符合...
  • 他更有可能将图像放在 Toolkit 无法找到的位置。但缺乏有关项目结构的信息只是一个疯狂的猜测......

标签: java trayicon


【解决方案1】:

Toolkit.getDefaultToolkit().getImage("smallicon.ico"); 仅支持 JPG、PNG 和 GIF 图片。

它不支持 ico 图片。使用另一张图片。

【讨论】:

    【解决方案2】:

    在 Windows 10 中,我可以通过这种方式在托盘中查看 16 像素的 PNG:

    final URL resource = getClass().getResource("icon16.png");
    final TrayIcon trayIcon = new TrayIcon(Toolkit.getDefaultToolkit().getImage(resource), "Application v0.1 tooltip");
    

    “预计”其他操作系统会缩小一个大图标,但我还没有测试过。

    【讨论】:

      【解决方案3】:

      嵌入图像(和任何其他非类资源)的标准方法是将它们放在项目中的 中,例如如果您的项目使用com.myproject.myapp,则创建一个包(实际上只是一个文件夹)images(在 myapp 下)并将图像文件放在那里。

      通过使用ClassLoader 方法getResource(name) 和/或getResourceAsStream(name) 可以访问这些图像(资源)。为了简单起见正确 ClassLoader 实例,许多人更喜欢在同一个包中创建一个类(例如“Images”)并在那里定义静态常量以按名称访问资源(就像 Images.CONSTANT_NAME 一样简单)。项目结构可能如下所示:

      com.myproject.myapp
          images
              Images.class
              MyImage1.png
      

      在图像类中,可以为资源句柄或资源本身定义常量:

      public final static URL MY_IMAGE_1 = Images.class.getResource("MyImage1.png");
      

      (然后可以将 URL 传递给 Toolkit)。如果渴望加载所有内容/加载图像本身是可行的:

      public final static Image MY_IMAGE_1 = loadImage("MyImage1.png");
      
      private static Image loadImage(String name) {
          URL url = Images.class.getClassLoader().getResource(name);
          Image img = Toolkit.getDefaultToolkit().getImage(url);
          // possible hack to force pre-loading of (toolkit) image in next line
          // new ImageIcon(img);
          return img;
      }
      

      显然,我在示例中省略了所有错误处理,加载方法应包括详细的错误处理和报告(记录/System.out 和/或抛出适当的异常)。

      这些方法可以在 IDE 中使用,也可以在为程序创建 jar 文件之后使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-27
        • 1970-01-01
        • 2017-01-18
        • 1970-01-01
        • 2010-10-02
        相关资源
        最近更新 更多