以编程方式关闭Java托盘气泡提示

3
我在使用 java.awt.SystemTray 来创建和管理托盘图标以及气泡消息。一切都运作良好。
但是我想知道是否有可能在消息显示后关闭或淡化它。
现在,用户需要点击气球或关闭它,否则消息将不会消失。

据我所知,如果用户没有对其做出反应,那么气泡会在一段时间后消失(可能是5秒)。 - Harry Joy
没有人...它不行!!!!!!!!!!! - Saneesh A T
1个回答

2

我不确定其他平台,但在Windows上,只有当计算机正在使用时 - 即用户正在键入或移动鼠标时,消息才会消失。如果您不移动鼠标或键入任何内容,则消息将保留在原地。

以下代码为我显示了一条消息。如果我移动鼠标,它会在大约5秒后消失。如果我不移动鼠标或键入任何内容,则消息会一直保留,直到我移动鼠标或键入内容,此时它会消失。

final TrayIcon ti = new TrayIcon(XTPSkin.getInstance().getAppIcon().getImage());
final SystemTray st = SystemTray.getSystemTray();
st.add(ti);
ti.displayMessage("foo", "bar", MessageType.INFO);

在时间未到之前,没有直接的方法可以删除消息 - 但是,您可以移除 TrayIcon(如果必要,立即重新添加,尽管这并不推荐)。移除 TrayIcon 会导致消息也被删除。

将以下代码添加到上面的代码中,可以同时移除 TrayIcon 和消息:

SwingUtilities.invokeLater(new Runnable(){
    public void run() {
        try {
            Thread.sleep(1000); // Don't do this
            st.remove(ti);
        } catch (InterruptedException ie) {
            // You won't need this when the sleep is removed
        }
    }
});

注意事项:

  • 你需要在上面的第一个代码块中添加一些AWTException的异常处理。
  • 第二个代码块中的Thread.sleep仅用于演示目的。由于此代码将在AWT线程上执行,因此在实际代码中不应该包含该睡眠。
  • 不断删除和重新添加TrayIcon可能是一个坏主意。由于如果用户正在使用机器,则消息确实会消失,因此最好不要这样做。

谢谢您,Bright。感谢您详细的解释。那么,是否有其他方法可以展示一些漂亮的菜单,带有图标的菜单,透明菜单等等? - Saneesh A T
@SaneeshAT,你为什么需要一个呢?如果你真的需要,上面的方法将删除气球提示。然后你可以立即重新添加系统托盘图标。总之,那是一个单独的问题。如果你需要答案,应该提出一个新的问题。如果你喜欢我对原始问题的回答,可以在旁边的复选框上点击。 - Jon Bright
也许你可以随意地稍微移动一下鼠标,这样它最终会消失? - rogerdpack
另一个选项可能是使用jna/jni/jnr或其他类似的库,枚举活动桌面窗口,发现其中的气球消息窗口,并发送某种关闭消息。 - rogerdpack
移除托盘图标并重新添加即可解决问题,谢谢! - Amr Lotfy

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