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

时间:2009-03-10 09:10:02

标签: java winapi swing usability java-native-interface

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

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

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

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

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

或者还有哪些其他选项可以通知用户在一个软件中执行的重要任务,而不会妨碍他在另一个软件中完成当前任务。因此,系统模态对话框是不可取的!

5 个答案:

答案 0 :(得分:3)

尝试在JFrame / JWindow上使用setAlwaysOnTop

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

无论您使用哪种方法,请尝试使其无法对焦(覆盖isFocusable方法)并致电toFront

也让我知道结果。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

以下是一个例子:

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)
    {
    }
}