Значок "Системный лоток" выглядит искаженным - программирование
Подтвердить что ты не робот

Значок "Системный лоток" выглядит искаженным

Я пытаюсь добавить значок и отобразить его на панели задач с помощью Java. Однако значок всегда либо слишком мал, либо обрезается в областях. Второй - слева, если вы не можете сказать.

Что я здесь делаю неправильно? Как я могу полностью отобразить этот значок? Какой стандартный размер значков используется для системного лотка?

Изменить: я использую AWT SystemTray и TrayIcon

4b9b3361

Ответ 1

После того, как вы загрузили реальный ресурс изображения с диска, вы можете изменить его размер до необходимого размера, создав "поддельный" "на лету" и используя его ширину.

Я обнаружил, что это лучше, чем использование метода setImageAutoSize(true), поскольку этот метод не масштабирует изображение плавно вообще.

BufferedImage trayIconImage = ImageIO.read(getClass().getResource("/path/to/icon.png"));
int trayIconWidth = new TrayIcon(trayIconImage).getSize().width;
TrayIcon trayIcon = new TrayIcon(trayIconImage.getScaledInstance(trayIconWidth, -1, Image.SCALE_SMOOTH));

Ответ 2

Чтобы отобразить значок с оптимальным размером, вам необходимо вручную изменить его размер до нужного размера. Этот правильный размер может различаться между операционными системами и предпочтениями, поэтому Java предоставляет метод для получения размеров значков панели задач, которые имеют 16x16 в случае вашего примера изображения.

if (SystemTray.isSupported()) {
    SystemTray tray = SystemTray.getSystemTray();
    Dimension trayIconSize = tray.getTrayIconSize();
    // resize icon image to trayIconSize
    // create your tray icon off of the resized image
}

Ответ 3

Согласно TrayIcon.setImageAutoSize(boolean).

Устанавливает свойство автоматического размера. Авто-размер определяет, будет ли изображение в лотке автоматически соответствовать размеру выделенного пространства для изображения на лотке. По умолчанию для свойства auto-size установлено значение false.

Если параметр auto-size равен false, а размер изображения не совпадает с пространством значков в трее, изображение будет окрашено как-внутри этого пространства - если оно больше, чем выделенное пространство, то будет обрезано.

Ответ 4

Я закончил комбинирование некоторых из этих ответов, чтобы сделать код, который я использую.

Это создает хороший значок в моем системном лотке из png, который начинается с 100x100.

Стоит отметить, что на сетчатке MacBook значок выглядит хуже, уменьшен. Поэтому я делаю чек в другом месте, чтобы увидеть, работает ли он на Mac и не применяет его, если это так.

public Image imageForTray(SystemTray theTray){

    Image trayImage = Toolkit.getDefaultToolkit().getImage("my100x100icon.png");
    Dimension trayIconSize = theTray.getTrayIconSize();
    trayImage = trayImage.getScaledInstance(trayIconSize.width, trayIconSize.height, Image.SCALE_SMOOTH);

    return trayImage;
}