10

Windows 8 似乎使托盘图标为 20 x 20 像素。似乎 Java 仍然认为它们应该是 16 x 16 像素。这会导致一些严重的失真,因为 Java 会缩小规模,然后 Windows 会重新扩大规模。以下示例使用这三个图像创建三个看起来像这样的托盘图标(注意变形):

20x20 绿色图标 20x20 红色图标 16x16 蓝色图标

生成的托盘.

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

这就是添加像素线后整个画面的放大效果(在新选项卡中打开图像会给你一个更清晰的视图):

在此处输入图像描述

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

4

2 回答 2

3

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

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

这需要报告为错误

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

如果你很绝望,你可以编写(或找到?)使用 JNA 或 JNI 的托盘图标的替代实现。中的代码WTrayIconPeer.java和相应的本机代码awt_TrayIcon.cpp可以作为指导。不过看起来工作量很大。

于 2014-08-29T20:14:15.927 回答
0

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

于 2014-08-29T18:46:39.977 回答