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