如何通知用户桌面应用程序的重要事件?

我们的客户使用我们的软件(Java Swing应用程序开始使用Webstart)以及其他软件(如MS Office)来完成他的工作。 他不时会在我们的软件中处理重要事件而不会有太多延迟。 客户希望获得明显的通知。 现在他可能正在使用Excel,因此弹出一个消息框是不够的(尽管任务栏中的条目会闪烁)。

我们需要一些机制,如Outlook通知程序,即一个始终可见但不会窃取焦点的弹出窗口。 通知程序应始终显示,直到消息原因消失(用户已解决问题)或用户已关闭消息(如Outlook中)。 此外,我们想要显示一个托盘图标,并可能播放声音。

我已经尝试了Java6 java.awt.SystemTray以及JDIC(版本0.9,因为我们已经在该项目的类路径中具有该lib)等效,但我没有找到一种方法来设置TrayIcon.displayMessage的超时方法,并且消息似乎不总是在顶部。

除了JNI还有其他选择来实现所请求的行为吗?

如果JNI是唯一的选择,并且由于Windows是我们客户的唯一平台,Outlook通知程序是仅Outlookfunction,还是可以通过Windows API自由使用?

或者存在什么其他选项来通知用户在一个软件中执行的重要任务,而不妨碍他在另一个软件中完成他当前的任务。 因此,系统modal dialog是不可取的!

尝试在JFrame / JWindow上使用setAlwaysOnTop 。

使用OS X,显而易见的答案是使用Growl 。 但是在Windows环境中存在一个做类似服务的小项目。 它被称为Snarl 。 这可能会为您提供一个新的选项。

缺点:您必须在客户端的计算机上安装工具。 根据您的描述,我假设您在公司工作场所拥有一组已定义的用户,对吧? 所以这可能是可以接受的。

使用托盘:您使用哪个组件来显示消息(JPopup,JDialog,JFrame,JWindow)?

无论你使用哪个,尝试使其无法聚焦(覆盖isFocusable方法)并调用toFront

也让我知道结果。

如果您有预算,请考虑JIDE的许可。 JIDE有一个警报弹出窗口,其设计与outlook弹出/警报小部件完全相同。

这是一个例子:

 class AlertWindow extends Window implements MouseListener { AlertWindow(JFrame frame) { super(frame); this.setAlwaysOnTop(true); this.setFocusable(false); this.setSize(200, 200); this.setLocation(500, 0); this.setBackground(Color.BLACK); addMouseListener(this); try { Class awtUtilitiesClass = Class.forName("com.sun.awt.AWTUtilities"); Method mSetWindowOpacity = awtUtilitiesClass.getMethod("setWindowOpacity", Window.class, float.class); mSetWindowOpacity.invoke(null, this, Float.valueOf(0.50f)); } catch (NoSuchMethodException ex) { ex.printStackTrace(); } catch (SecurityException ex) { ex.printStackTrace(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } catch (IllegalAccessException ex) { ex.printStackTrace(); } catch (IllegalArgumentException ex) { ex.printStackTrace(); } catch (InvocationTargetException ex) { ex.printStackTrace(); } } public void mouseClicked(MouseEvent e) { this.setVisible(false); } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } }