デスクトップアプリケーションの重要なイベントをユーザーに通知する方法は?
-
08-07-2019 - |
質問
お客様は、MS Officeのような他のソフトウェアに加えて、当社のソフトウェア(Webstartを使用して開始されたJava Swingアプリケーション)を使用して仕事をしています。彼は私たちのソフトウェアで多くの遅延なく対処しなければならない重要なイベントを時々持っています。顧客は目立つ通知を受け取りたいと考えています。現在、彼はExcelを使用している可能性があるため、メッセージボックスをポップアップするだけでは十分ではありません(ただし、タスクバーのエントリは点滅します)。
Outlookノーティファイアなどのメカニズム、つまり、常に表示されているがフォーカスを奪わないポップアップが必要です。通知機能は、メッセージの理由がなくなる(ユーザーが問題を解決する)か、ユーザーがメッセージを閉じる(Outlookなど)まで、常に表示される必要があります。さらに、トレイアイコンを表示し、サウンドを再生することもできます。
Java6 java.awt.SystemTrayおよびJDIC(そのプロジェクトのクラスパスにすでにlibがあるためバージョン0.9)に相当するものを試しましたが、 TrayIcon.displayMessageメソッド、およびメッセージが常に一番上にあるとは限りません。
要求された動作を実現するために、JNI以外のオプションはありますか?
JNIが唯一の選択肢であり、Windowsがお客様の唯一のプラットフォームである場合、OutlookノーティファイアはOutlookのみの機能ですか、それともWindows APIを介して自由に使用できますか?
または、他のソフトウェアで現在のタスクを完了することを妨げることなく、あるソフトウェアで実行する重要なタスクについてユーザーに通知する他のオプションがあります。したがって、システムモーダルダイアログはオプションではありません!
解決
setAlwaysOnTop JFrame / JWindowで。
他のヒント
トレイの使用:メッセージの表示に使用しているコンポーネント(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)
{
}
}