Java 让JFace窗口在任务栏中闪烁或引起用户注意?
我想知道有人知道如何解决这个问题: 在我的JavaEclipse插件中,有一些过程需要一些时间。因此,用户可以最小化窗口,让进程在后台运行。Java 让JFace窗口在任务栏中闪烁或引起用户注意?,java,eclipse,swt,jface,blink,Java,Eclipse,Swt,Jface,Blink,我想知道有人知道如何解决这个问题: 在我的JavaEclipse插件中,有一些过程需要一些时间。因此,用户可以最小化窗口,让进程在后台运行。 现在,当这个过程结束时,我可以强迫窗口再次到达顶部,但这在可用性方面是一个禁忌。我更希望进程在任务栏中闪烁。有什么办法可以做到这一点吗? 我看了一下,但找不到类似的东西,SWT文档也是如此… 我想到的另一件事是,当人们在mac os x和linux上使用该应用程序时,是否有一个平台无关的解决方案,它会通知用户该过程已经完成,但不会将窗口置于顶部? 欢迎提
现在,当这个过程结束时,我可以强迫窗口再次到达顶部,但这在可用性方面是一个禁忌。我更希望进程在任务栏中闪烁。有什么办法可以做到这一点吗? 我看了一下,但找不到类似的东西,SWT文档也是如此… 我想到的另一件事是,当人们在mac os x和linux上使用该应用程序时,是否有一个平台无关的解决方案,它会通知用户该过程已经完成,但不会将窗口置于顶部? 欢迎提出任何意见 编辑:
我发现,在windows上,用户可以调整是否要启用前景强制。如果该选项被禁用,任务将在任务栏中闪烁…
这是一个很好的例子…
如果有人知道实现这种行为的某种平台无关方式,请与我分享您的知识 我认为没有一种平台独立的方法可以做到这一点。您必须查看特定于平台的API调用,并通过JNI或JNA实现它们 对于Windows,以下是我自己的一个应用程序的代码片段:
public static void flashWindow(final Shell shell, boolean flashTray,
boolean flashWindow) {
try {
if (isActiveWindow(shell)) {
flashWindow = false;
flashTray = false;
}
User32 lib = (User32) getLibrary("user32", User32.class);
User32.FLASHWINFO flash = new User32.FLASHWINFO();
flash.hWnd = new W32API.HANDLE(new W32API.UINT_PTR(shell.handle)
.toPointer());
flash.uCount = 2;
flash.dwTimeout = 1000;
if (flashTray || flashWindow) {
flash.dwFlags = (flashTray ? User32.FLASHW_TRAY : 0)
| (flashWindow ? User32.FLASHW_CAPTION : 0);
} else {
flash.dwFlags = User32.FLASHW_STOP;
}
flash.cbSize = flash.size();
if (lib.FlashWindowEx(flash) && !flashWindow) {
final FocusListener focusListener = new FocusListener() {
public void focusGained(FocusEvent arg0) {
flashWindow(shell, false, false);
shell.removeFocusListener(this);
}
public void focusLost(FocusEvent arg0) {
}
};
shell.addFocusListener(focusListener);
}
} catch (UnsatisfiedLinkError e) {
}
}
以下是简化版的getLibrary()
:
受保护的静态StdCallLibrary getLibrary(字符串libraryName,
类接口类)抛出未满足的链接错误{
试一试{
StdCallLibrary=(StdCallLibrary)Native.loadLibrary(libraryName,
接口类);
返回lib;
}捕获(未满足链接错误e){
Logger.out.error(“无法加载”+libraryName+“library.”);
投掷e;
}
}
处理完库后,请小心
dispose()
库。要想吸引用户的注意而不让人讨厌,您可以做的是更改windows文本这可以通过一个简单的:
shellName.setText("task 20% complete")
这将允许用户在最小化窗口的同时获得更新,然后添加焦点侦听器,以便在恢复焦点时将窗口返回到其正常文本。这将允许在通知用户的同时尽量减少干扰。我的插件也有类似的问题 我最后做的是在较低的状态dock中为我的程序创建一个小图标(或底部的任何东西)。根据流程和其他背景事件的完成情况,我的图标会改变颜色并闪烁(例如,初始设置完成后,图标会从灰色变为绿色)
通过双击或右键点击这个图标,我可以打开相应的窗口 嗯,这并不完全是闪烁的,但是自从Eclipse3.6M6以来,您可以使用SWT以独立于平台的方式将文本、图像或进度条覆盖到TaskItem上。请参阅和。感谢您提供的代码片段-但我并不想为每个操作系统提供多个不同的版本…据我所知,没有纯Java解决方案。JNA/JNI可能非常强大,但您只需要有三个实现。不幸的是,你必须向其他人要另外两个。:)谢谢,我已经看过这个功能了,但问题是我不能强迫我的用户升级到3.6:-(太糟糕了。也许可以将这个功能分成一个具有适当版本限制的插件,并将其标记为可选?你是说windows中的任务栏?还是这是一个操作系统iDependent的解决方案?
shellName.setText("task 20% complete")