我正在尝试使用Java将图标添加并显示到系统托盘。然而,该图标通常要么太小,要么在某些区域被裁剪掉。 如果你没看出来的话,它是从左数第二个。
我做错了什么?如何让这个图标完全显示?系统托盘中使用的标准图标大小是多少?
编辑:我正在使用AWT SystemTray和TrayIcon。
我正在尝试使用Java将图标添加并显示到系统托盘。然而,该图标通常要么太小,要么在某些区域被裁剪掉。 如果你没看出来的话,它是从左数第二个。
我做错了什么?如何让这个图标完全显示?系统托盘中使用的标准图标大小是多少?
编辑:我正在使用AWT SystemTray和TrayIcon。
当你从磁盘中检索到实际的图像资源后,你可以创建一个“假”的图像并获取其宽度来将其调整为所需的大小。
我发现这比使用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));
TrayIcon.setImageAutoSize(boolean)
。true
,这可以解决 HiDPI 上的缩放问题。不幸的是,在 Windows HiDPI 上,图标大小被错误地报告为 16x16
,所以接下来,我必须检测屏幕缩放并将乘数应用于图标尺寸,然后选择正确的图标大小。 - tresfif (SystemTray.isSupported()) {
SystemTray tray = SystemTray.getSystemTray();
Dimension trayIconSize = tray.getTrayIconSize();
// resize icon image to trayIconSize
// create your tray icon off of the resized image
}
我将一些答案结合起来,制作了我正在使用的代码。
这会从100x100的png文件中生成一个外观良好的系统托盘图标。
值得注意的是,在Retina 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;
}
SystemTray.getSystemTray().getTrayIconSize()
获取图标的正确尺寸,而不必创建一个虚假的图标。 - Gui Meira