3

私たちの顧客は、MS Office などの他のソフトウェアに加えて、私たちのソフトウェア (Webstart を使用して開始された Java Swing アプリケーション) を使用して仕事をしています。ときどき、彼が私たちのソフトウェアで遅滞なく処理しなければならない重要なイベントがあります。その場合、顧客は目立つ通知を望んでいます。現在、彼は Excel を使用している可能性があるため、メッセージ ボックスをポップアップ表示するだけでは十分ではありません (ただし、タスク バーのエントリは点滅します)。

Outlook 通知機能のようなメカニズム、つまり常に表示されているがフォーカスを奪わないポップアップが必要です。通知機能は、メッセージの理由がなくなる (ユーザーが問題を解決する) か、ユーザーがメッセージを閉じる (Outlook など) まで、常に表示される必要があります。さらに、トレイ アイコンを表示し、場合によってはサウンドを再生します。

Java6 java.awt.SystemTray と JDIC (そのプロジェクトのクラスパスにすでにそのライブラリがあるため、バージョン 0.9) に相当するものを試しましたが、TrayIcon.displayMessage のタイムアウトを設定する方法が見つかりませんでした。メソッド、およびメッセージが常に一番上にあるとは限らないようです。

要求された動作を実現するための JNI 以外のオプションはありますか?

JNI が唯一の選択肢であり、Windows がお客様の唯一のプラットフォームである場合、Outlook 通知機能は Outlook のみの機能ですか、それとも Windows API を介して自由に使用できますか?

または、ユーザーが別のソフトウェアで現在のタスクを完了するのを妨げることなく、あるソフトウェアで実行する重要なタスクについてユーザーに通知するために、他にどのようなオプションがありますか? したがって、システム モーダル ダイアログはオプションではありません。

4

5 に答える 5

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 に答える