托盘图标根本没有在java中显示

问题描述 投票:1回答:3

我一整天都在尝试添加托盘图标,但它不起作用。我有一个存储在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
}

}

java trayicon
3个回答
2
投票

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

它不支持ico图像。使用其他图像。


1
投票

在Windows 10中,我已经能够以这种方式在托盘中查看16像素的PNG:

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

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


0
投票

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

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

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

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

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;
}

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

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

© www.soinside.com 2019 - 2024. All rights reserved.