在Linux中美化Java系统托盘

29

我正在Linux上制作一个使用Java 6和Swing的sytray的Java应用程序。该应用程序看起来很棒(使用系统外观),但是systray菜单看起来很丑陋。我的意思是systray菜单看起来像旧小部件(Motif?)。 我想知道是否有一种方法可以设置外观和感觉或其他东西,使系统托盘更漂亮。

这是托盘的屏幕截图: 输入图像描述


2
我已删除我的答案,因为似乎 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 不适用于这些菜单。+1,好问题。 - user257111
1
@pst:确实吗?那正是我记得的 Motif 的样子。 - Joachim Sauer
在测试JPopupMenu建议时,大多数人最终都会遇到问题(包括来自sunlabs的非常好的JXTrayIcon类),但是菜单在Linux上仍然无法正常工作。经过多次尝试,我发现将JPanel的可见性绑定为弹出窗口的触发器可以使其正常工作。这是我在Linux中唯一有效的解决方案。请注意,它会添加轻微的延迟,但应该可以修复JPopupMenu的显示/隐藏问题。https://gist.github.com/tresf/d826eaeecfa887e576f0 - tresf
6个回答

8

你尝试过JXTrayIcon吗?

我在Ubuntu 10.10上使用Compiz测试了SwingHelper的这个演示,看起来很酷。

更新

截至2020年,这些链接已经失效,此解决方案今天存在许多缺点。例如,GNOME3桌面环境已完全删除系统托盘图标,并将其替换为AppIndicator。

Java(AWT / Swing)系统托盘支持今天已经不可用。我建议使用这个Java库:https://github.com/dorkbox/SystemTray

来自该网站:

专业的、跨平台的Swing / AWT、GtkStatusIcon和AppIndicator系统托盘支持,适用于Java 6+。该库提供了OS本地菜单和Swing / AWT菜单,具体取决于操作系统和桌面环境以及是否启用AutoDetect(默认情况下启用)。

供参考,您可以在此处找到原始示例的副本。


这似乎使用了正确的外观和感觉(我自己测试过)。 - Petriborg
dorkbox SystemTray 库在 Java 9+ 模块系统中存在问题:https://github.com/dorkbox/SystemTray/issues/105 - willena

2
我为此编写了自己的库。这是链接:http://www.2shared.com/file/sQdjb6aG/jtray.html
使用方法:
import javax.swing.jtray.*;

JTrayIcon.initSystemTray();
JTrayIcon icon = new JTrayIcon(img, "Tooltip", jpopupmenu);
icon.displayMessage(null, "Title", "Multiline\nsecondline", 3000); // 3 seconds

这个库使用了一些“小技巧”,所以可能在任何Linux平台上的运行效果都不如在Ubuntu上好。它也应该能在Windows和OSX上工作。


2
由于Swing在Systray上使用AWT,如果您想要在Systray上获得良好的外观效果,也许您可以尝试使用SWT :)

2
Swing使用模拟UI小部件。它有许多样式或主题可供应用。如果您希望获得更本地的结果,您需要寻找另一个小部件工具包。您有几个选择:
  1. 如果您的需求非常基础,您可能会满意原始的Java UI工具包AWT。它使用本地小部件,但支持的小部件库非常有限。

  2. 如果您想超越AWT,请考虑由Eclipse.org维护的SWT。它为您提供了丰富的小部件库,这些小部件都是以本地方式实现的。


抱歉,我想我写错了问题,我的意思是应用程序使用和渲染得很好,只有系统托盘不好。 - Marcos Roriz Junior
我猜你在系统托盘代码中缺少外观设置...之前有另一个带有代码片段的答案说明如何设置外观,但现在好像已经消失了。 - Konstantin Komissarchik
如果你没有得到更好的答案,我建议尝试使用AWT来创建系统托盘菜单,同时保持应用程序其他部分为Swing。AWT完全能够渲染此菜单,已经存在于JRE中,而且你不必担心外观和感觉的问题。 - Konstantin Komissarchik

1

我自己没有尝试过,但是如果你正在使用Java 6更新版10或更高版本,可以使用新的Nimbus外观吗?:

使用Nimbus LAF

我听说过在Ubuntu上使用“JPopupMenu”的托盘图标,它使用Nimbus外观,所以这可能是你最好的选择:

在TrayIcon中使用JPopupMenu

从我看到的,仅使用JPopupMenu就会有很大的改进-再加上Nimbus,它应该很棒。


1
一个快速且简单的解决方法: 创建一个无装饰的JDialog,为其添加一个JPopupMenu,并通过你的TrayIcon鼠标监听器来使其可见。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接