Windows 10 通知中出现的空白图标

7
我的Java应用程序使用类似以下代码的方式在系统托盘中显示其图标:
Toolkit mainToolkit = Toolkit.getDefaultToolkit();
SystemTray mainTray = SystemTray.getSystemTray();
Image trayIconImage = mainToolkit.createImage(getClass().getResource(resourcePath));
TrayIcon mainTrayIcon = new TrayIcon(trayIconImage);
mainTray.add(mainTrayIcon);

有时我会这样更改图标:
Image newImage = mainToolkit.createImage(getClass().getResource(otherPath));
mainTrayIcon.setImage(newImage);

有时我的应用程序需要显示一些通知(使用从托盘图标发出的气球消息):

mainTrayIcon.displayMessage(someCaption,  msg, TrayIcon.MessageType.NONE);

所有这些代码实际上都是简化的,但非常好地掌握了这个功能。

所以在Windows 7上一切都很好。但事实证明,在Windows 10上显示方式不同。在通知中,左侧显示一个图标。它通常是我的应用程序当前的托盘图标,但有时它只是空白:

The erroneous notification

在通知的上面的红色圆圈里(在通知上),是那个有时代替我的应用程序图标的空白图标(在系统托盘的下面的红色圆圈上)。我不知道为什么会发生这种情况。我只知道,这只会在应用程序的托盘图标和通知消息在第一个通知消失之前更改时发生。如果显示通知,然后手动淡出/关闭,然后再更改应用程序的托盘图标和通知,下一个通知(带有刚刚设置的新消息)将正确显示应用程序的图标。

2个回答

2

我刚遇到这个问题,并找到正确的解决方案:

mainTrayIcon.setImageAutoSize(true);

以下是在Windows上发送通知的方法:

public static void sendNotification(String title, String subtitle, String pathToIcon) {
    SystemTray mainTray = SystemTray.getSystemTray();
    Image trayIconImage = Toolkit.getDefaultToolkit().getImage(pathToIcon);
    TrayIcon mainTrayIcon = new TrayIcon(trayIconImage);
    mainTrayIcon.setImageAutoSize(true);
    try {
        mainTray.add(mainTrayIcon);
        mainTrayIcon.displayMessage(title,  subtitle, TrayIcon.MessageType.NONE);
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

调用sendNotification("标题", "副标题", "icons/icon-128.png");会显示:

工作中的通知


抱歉回复晚了,我很长时间无法处理这个应用程序。我刚刚检查了一下,发现它无法正常工作。此外,您的答案意味着每次都要添加新的托盘图标,而且它们会不断增加,所以这也不是我想要的。我只需要更改托盘图标的图像,就这样。 - PookyFan

0
//this method to showing notification
public void notifacation(String filenamev, String tooltipv, String etats, String textv, String capationv, String messagetype) {
    try {
        //Obtain only one instance of the SystemTray object
        SystemTray tray = SystemTray.getSystemTray();

        // If you want to create an icon in the system tray to preview
        Image image = Toolkit.getDefaultToolkit().createImage(filenamev);
        //Alternative (if the icon is on the classpath):
        //Image image = Toolkit.getDefaultToolkit().createImage(getClass().getResource("icon.png"));

        TrayIcon trayIcon = new TrayIcon(image, tooltipv);
        //Let the system resize the image if needed
        trayIcon.setImageAutoSize(true);
        //Set tooltip text for the tray icon
        trayIcon.setToolTip(etats);
        tray.add(trayIcon);

        // Display info notification:
        // trayIcon.displayMessage(capationv, textv, TrayIcon.MessageType.ERROR
        trayIcon.displayMessage(capationv, textv, MessageType.valueOf(messagetype));

        // Error:
        // trayIcon.displayMessage("Hello, World", "Java Notification Demo", MessageType.ERROR);
        // Warning:
        // trayIcon.displayMessage("Hello, World", "Java Notification Demo", MessageType.WARNING);
    } catch (Exception ex) {
        System.err.print(ex);
    }
}

请解释你的答案。 - Lajos Arpad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接