Windows 8 искажает мой TrayIcon

Похоже, что в Windows 8 значки в трее имеют размеры 20 х 20 пикселей. Кажется, что Java все еще думает, что они должны быть 16 х 16 пикселей. Это вызывает некоторые серьезные искажения, поскольку Java уменьшает масштаб, а затем Windows снова масштабирует. В следующем примере эти три изображения используются для создания трех значков в трее, которые выглядят следующим образом (обратите внимание на искажение):

Зеленый значок 20х20Красный значок 20х2016x16 синий значок

поднос,

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?

2 ответа

Размер 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 может служить в качестве руководства. Похоже, много работы, хотя.

Это может быть просто вопрос использования значка, который имеет степень 2 - 16x16, 32x32 и т. Д. Хотя нативная ОС (в вашем случае Windows) поддерживает ее, java обрабатывает значки панели задач и значки программ с силой 2 только размер изображения. Попробуйте изменить его до 32x32 и попробуйте снова.

Другие вопросы по тегам