Значок "Системный лоток" выглядит искаженным
Я пытаюсь добавить значок и отобразить его на панели задач с помощью Java. Однако значок всегда либо слишком мал, либо обрезается в областях.
Второй - слева, если вы не можете сказать.
Что я здесь делаю неправильно? Как я могу полностью отобразить этот значок? Какой стандартный размер значков используется для системного лотка?
Изменить: я использую AWT SystemTray и TrayIcon
Ответы
Ответ 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;
}