Java Windows 8扭曲了我的TrayIcon

Java Windows 8扭曲了我的TrayIcon,java,windows,trayicon,Java,Windows,Trayicon,Windows 8似乎使托盘图标为20 x 20像素。似乎Java仍然认为它们应该是16 x 16像素。这会导致一些严重的失真,因为Java会缩小大小,然后Windows会将大小恢复。以下示例使用这三个图像创建三个托盘图标,如下所示(注意失真): 这就是通过添加像素线放大的整体外观(在新选项卡中打开图像将使您的视图更清晰): 我的问题: 如何防止Java/Windows 8扭曲我的图标 可能只是使用一个2-16x16、32x32等大小的图标。虽然本机操作系统(在您的情况下是Windows

Windows 8似乎使托盘图标为20 x 20像素。似乎Java仍然认为它们应该是16 x 16像素。这会导致一些严重的失真,因为Java会缩小大小,然后Windows会将大小恢复。以下示例使用这三个图像创建三个托盘图标,如下所示(注意失真):

这就是通过添加像素线放大的整体外观(在新选项卡中打开图像将使您的视图更清晰):

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

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

16×16的大小显然是硬编码到Java TrayIcon实现中的。我看不到在运行时改变它的方法。发件人:

这是必须的

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

如果您不顾一切,可以使用JNA或JNI编写(或找到?)托盘图标的替代实现。
WTrayIconPeer.java中的代码

中相应的本机代码可以作为指导。这看起来需要做很多工作。

这听起来可能有点明显,但正确的做法是提供20x20图标,以便Windows 8可以使用它们。@pablosaraiva您会注意到,绿色和红色图标实际上是20x20图标,Java将其缩小,然后Windows将其放大——因此会出现失真。抱歉,我没有意识到这一点。不用担心,感谢你至少对这个问题给予一些关注!
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));
    }
}
final static int TRAY_ICON_WIDTH = 16;
final static int TRAY_ICON_HEIGHT = 16;