【发布时间】:2012-08-30 12:13:27
【问题描述】:
我正在尝试使用 Java 将图标添加并显示到系统托盘。但是,图标总是太小,或者在某些区域被截断。 如果你看不出来,它是左数第二个。
我在这里做错了什么?我怎样才能让这个图标完全显示?用于系统托盘的标准图标大小是多少?
编辑:我正在使用 AWT SystemTray 和 TrayIcon
【问题讨论】:
标签: java swing icons system-tray trayicon
我正在尝试使用 Java 将图标添加并显示到系统托盘。但是,图标总是太小,或者在某些区域被截断。 如果你看不出来,它是左数第二个。
我在这里做错了什么?我怎样才能让这个图标完全显示?用于系统托盘的标准图标大小是多少?
编辑:我正在使用 AWT SystemTray 和 TrayIcon
【问题讨论】:
标签: java swing icons system-tray trayicon
从磁盘中检索到实际图像资源后,您可以通过动态创建“假”图像资源并获取其宽度来将其调整为所需的大小。
我发现这比使用@987654321@ 方法要好,因为该方法根本无法平滑缩放图像。
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));
【讨论】:
SystemTray.getSystemTray().getTrayIconSize() 获得正确的图标尺寸,而无需创建假图标。
要以最佳大小显示图标,您需要手动将其调整为正确大小。此正确大小可能因操作系统和首选项而异,因此 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
}
【讨论】:
根据TrayIcon.setImageAutoSize(boolean).
设置自动大小属性。自动调整大小确定托盘图像是否自动调整大小以适合托盘上图像分配的空间。默认情况下,auto-size 属性设置为 false。
如果 auto-size 为 false,并且图像大小与托盘图标空间不匹配,则图像在该空间内按原样绘制 - 如果大于分配的空间,则 将被裁剪。
【讨论】:
true,它修复了 HiDPI 上的缩放。不幸的是,在 Windows HiDPI 上,图标大小被错误地报告为 16x16,所以接下来,我必须检测屏幕缩放比例并对图标尺寸应用乘数,然后选择正确的图标大小。
我最终将其中的一些答案组合在一起,以制作我正在使用的代码。
这会在我的系统托盘中从一个从 100x100 开始的 png 生成一个好看的图标。
值得注意的是,在视网膜 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;
}
【讨论】: