3

除了 MS Office 等其他软件外,我们的客户还使用我们的软件(Java Swing 应用程序开始使用 Webstart)来完成他的工作。有时,他必须毫不拖延地在我们的软件中处理重要事件。客户希望有一个突出的通知。现在他可能正在使用 Excel,所以弹出一个消息框是不够的(尽管任务栏中的条目会闪烁)。

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

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

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

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

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

4

5 回答 5

3

尝试在您的 JFrame/JWindow 上使用setAlwaysOnTop 。

于 2009-03-10T11:22:55.007 回答
2

对于 OS X,显而易见的答案是使用Growl。但是有一个小项目在 Windows 环境中提供类似的服务。它被称为咆哮。这可能会给你一个新的尝试选择。

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

于 2009-03-10T10:36:18.503 回答
1

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

无论您使用哪种方式,请尝试使其无法聚焦(覆盖isFocusable方法)并调用toFront.

也让我知道结果。

于 2009-03-10T10:54:05.530 回答
0

如果您有预算,请考虑获得JIDE的许可证。JIDE 有一个警报弹出窗口,其设计看起来与 Outlook 弹出窗口/警报小部件完全一样。

于 2009-03-10T10:59:38.683 回答
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)
    {
    }
}
于 2009-03-10T14:30:15.370 回答