【问题标题】:System Tray icon looks distorted系统托盘图标看起来扭曲
【发布时间】:2012-08-30 12:13:27
【问题描述】:

我正在尝试使用 Java 将图标添加并显示到系统托盘。但是,图标总是太小,或者在某些区域被截断。 如果你看不出来,它是左数第二个。

我在这里做错了什么?我怎样才能让这个图标完全显示?用于系统托盘的标准图标大小是多少?

编辑:我正在使用 AWT SystemTray 和 TrayIcon

【问题讨论】:

    标签: java swing icons system-tray trayicon


    【解决方案1】:

    从磁盘中检索到实际图像资源后,您可以通过动态创建“假”图像资源并获取其宽度来将其调整为所需的大小。

    我发现这比使用@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));
    

    【讨论】:

    • +1 参考精美手册,我认为 OP 需要将其作为第一站。
    • 对不起,在linux上添加透明背景图片不起作用。
    • 您还可以使用SystemTray.getSystemTray().getTrayIconSize() 获得正确的图标尺寸,而无需创建假图标。
    【解决方案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
    }
    

    【讨论】:

    • 调整图像大小非常简单; here's a nice tutorial 就可以了。
    • 16x16 在我的任务栏上看起来太小了
    • 根据您问题中的图片,16x16 是您操作系统的托盘图标大小。 SystemTray#getTrayIconSize() 返回您的托盘图标大小是多少?
    【解决方案3】:

    根据TrayIcon.setImageAutoSize(boolean).

    设置自动大小属性。自动调整大小确定托盘图像是否自动调整大小以适合托盘上图像分配的空间。默认情况下,auto-size 属性设置为 false。

    如果 auto-size 为 false,并且图像大小与托盘图标空间不匹配,则图像在该空间内按原样绘制 - 如果大于分配的空间,则 将被裁剪。

    【讨论】:

    • +1 ...虽然最简单的解决方案是将托盘图标设置为自动调整大小,但不幸的是,在内部,它似乎使用了一种不平滑的算法大多数人会发现无法用于生产用途。自动调整大小的图像将不平滑并具有锯齿状边缘。我怀疑这样做是出于性能原因。我通常手动调整大小:stackoverflow.com/a/12287388/216104
    • 赞成,因为对于 Windows,我将此值默认为 true,它修复了 HiDPI 上的缩放。不幸的是,在 Windows HiDPI 上,图标大小被错误地报告为 16x16,所以接下来,我必须检测屏幕缩放比例并对图标尺寸应用乘数,然后选择正确的图标大小。
    【解决方案4】:

    我最终将其中的一些答案组合在一起,以制作我正在使用的代码。

    这会在我的系统托盘中从一个从 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;
    }
    

    【讨论】:

    • 这可能有点离题,但我建议使用大小为 2 的倍数的基本图标(已证明 128x128 效果很好)。通常,图标大小基于 2 的倍数,这将允许通过基于整数的缩放来处理图像。这通常看起来比分数缩放好得多(除非您有非常大的图像)。另一个不错的选择是 96x96 像素,它有许多“有用的”除数。
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 2020-02-08
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    相关资源
    最近更新 更多