Windows 8扭曲了我的TrayIcon

时间:2013-09-17 20:20:40

标签: java windows trayicon

Windows 8似乎使托盘图标为20 x 20像素。似乎Java仍然认为它们应该是16 x 16像素。这会导致一些不良的失真,因为Java会缩小范围,然后Windows会重新调整内容。以下示例使用这三个图像创建三个看起来像这样的托盘图标(注意失真):

20x20 green icon 20x20 red icon 16x16 blue icon

resulting tray

import java.awt.Image;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;

public class TrayTest
{
    public static void main(String[] args) throws Exception
    {
        final SystemTray tray = SystemTray.getSystemTray();

        TrayIcon trayIcon16 = new TrayIcon(getImage("16pxBlue.png"));
        tray.add(trayIcon16);

        TrayIcon trayIcon20 = new TrayIcon(getImage("20pxRed.png"));
        tray.add(trayIcon20);

        TrayIcon trayIcon20autoSize = new TrayIcon(getImage("20pxGreen.png"));
        trayIcon20autoSize.setImageAutoSize(true);
        tray.add(trayIcon20autoSize);
    }

    public static Image getImage(String resource)
    {
        return Toolkit.getDefaultToolkit().createImage(TrayTest.class.getResource(resource));
    }
}

这就是整个事物看起来像放大了像素线(在新标签中打开图像会给你一个更清晰的视图):

enter image description here

我的问题: 如何防止Java / Windows 8扭曲我的图标?

2 个答案:

答案 0 :(得分:3)

16×16大小显然硬编码到Java TrayIcon实现中。我没有看到在运行时更改它的方法。来自WTrayIconPeer.java

final static int TRAY_ICON_WIDTH = 16;
final static int TRAY_ICON_HEIGHT = 16;

这必须是reported as a bug

作为一种解决方法,使用平滑的抗锯齿图标会使失真变得不那么明显。

如果你很绝望,你可以使用JNA或JNI编写(或找到?)托盘图标的替代实现。 WTrayIconPeer.java和中的代码 awt_TrayIcon.cpp中相应的原生代码可以作为指南。虽然看起来很多工作。

答案 1 :(得分:0)

这可能仅仅是使用2 - 16x16,32x32等功能的图标。尽管本机操作系统(Windows,在您的情况下)支持它,但java处理任务栏图标和程序图标只有2个大小的图像的力量。尝试将其调整为32x32,然后重试。