如何通知用户桌面应用程序的重要事件?
-
08-07-2019 - |
题
我们的客户正在使用我们的软件(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自由使用?
或者还有哪些其他选项可以通知用户在一个软件中执行的重要任务,而不会妨碍他在另一个软件中完成当前任务。因此,系统模态对话框是不可取的!
解决方案
尝试使用 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)
{
}
}