我想知道有人知道如何解决这个问题:
在我的Java Eclipse插件中,有一些过程需要一些时间。因此,用户可能最小化窗口并让进程在后台运行。
现在,当过程完成时,我可以强制窗口再次登顶,但这是可用性的禁忌。我宁愿让过程在任务栏中闪烁。有没有办法实现这个目标?
我看了org.eclipse.jface.window但是找不到那样的东西,SWT文档同样如此......
我想到的另一件事 - 当人们在 mac os x 和 linux 上使用这个应用程序时,是否有平台独立解决方案 ,这将通知用户该过程已完成但没有将窗口置于顶部?
非常欢迎任何想法!
修改:
我发现在Windows上,用户可以调整是否要将力设置为前景。如果禁用该选项,任务将在任务栏中闪烁...
这是一个很好的read ......
如果有人知道某种平台独立的方式来实现这种行为,请与我分享您的知识!
答案 0 :(得分:2)
我认为没有一种独立于平台的方法。您将不得不查看特定于平台的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()
的简化版本:
protected static StdCallLibrary getLibrary(String libraryName,
Class<?> interfaceClass) throws UnsatisfiedLinkError {
try {
StdCallLibrary lib = (StdCallLibrary) Native.loadLibrary(libraryName,
interfaceClass);
return lib;
} catch (UnsatisfiedLinkError e) {
Logger.out.error("Could not load " + libraryName + " library.");
throw e;
}
}
完成后,请小心dispose()
图书馆。
答案 1 :(得分:2)
嗯,这并不是完全闪烁,但是从Eclipse 3.6 M6开始,您可以使用SWT以独立于平台的方式将文本,图像或进度条覆盖到TaskItem。请参阅New and Noteworthy和SWT snippet。
答案 2 :(得分:1)
你可以做些什么来引起用户的注意而不烦人的是改变windows文本,这很简单:
shellName.setText("task 20% complete")
这将允许用户在使窗口最小化的同时获得更新,然后添加焦点监听器以在重新获得焦点时将窗口返回到其正常文本。这样可以在通知用户的同时实现最小的干扰。
答案 3 :(得分:0)
我的插件遇到了类似的问题。
我最终做的是为我的程序在较低状态的Dock中创建一个小图标(或者调用底部的任何东西)。基于过程和其他背景事件的完成,我的图标会改变颜色并闪烁(例如,当初始设置完成时,从灰色变为绿色)。
通过双击或右键单击此图标上下文相关,我可以执行诸如打开相应窗口之类的操作。