9

我想知道有人知道如何解决这个问题:

在我的 Java Eclipse 插件中,有一些过程需要一些时间。因此,用户可能会最小化窗口并让进程在后台运行
现在,当该过程完成时,我可以强制窗口再次回到顶部,但这在可用性方面是一个禁忌。我宁愿希望进程在任务栏中闪烁。有什么办法可以做到这一点?

我查看了org.eclipse.jface.window但找不到类似的东西,SWT 文档也是如此......

我想到的另一件事 - 当人们也在mac os xlinux上使用这个应用程序时,是否有一个独立于平台的解决方案,它会通知用户该过程已经完成但没有将窗口带到顶部?

任何想法都非常受欢迎!

编辑:
我发现在 Windows 上,用户可以调整他是否想启用强制前景。如果该选项被禁用,任务只会在任务栏中闪烁......
这是一个很好的阅读......

如果有人可能知道一些独立于平台的方式来实现这种行为,请与我分享您的知识!

4

4 回答 4

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()图书馆。

于 2010-05-05T18:39:11.527 回答
2

嗯,这并不完全是闪烁,但是从 Eclipse 3.6 M6 开始,您可以使用 SWT 以独立于平台的方式将文本、图像或进度条覆盖到 TaskItem。请参阅New and NoteworthySWT 片段

于 2010-05-18T07:57:03.053 回答
1

你可以做些什么来引起用户的注意而不是烦人是改变windows文本,这很简单:

shellName.setText("task 20% complete")

这将允许用户在窗口最小化时获得更新,然后添加焦点侦听器以在重新获得焦点时将窗口返回到其正常文本。这将在通知用户的同时允许最小的干扰。

于 2010-05-17T21:15:23.533 回答
0

我的插件也有类似的问题。

我最终做的是在较低的状态停靠栏中为我的程序创建一个小图标(或底部的任何东西)。基于进程和其他背景事件的完成,我的图标会改变颜色并闪烁(例如,在其初始设置完成时从灰色变为绿色)。

通过在上下文相关的图标上双击或右键单击,我可以执行诸如打开相应窗口之类的操作。

于 2010-05-17T21:32:50.543 回答