Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 让JFace窗口在任务栏中闪烁或引起用户注意?_Java_Eclipse_Swt_Jface_Blink - Fatal编程技术网

Java 让JFace窗口在任务栏中闪烁或引起用户注意?

Java 让JFace窗口在任务栏中闪烁或引起用户注意?,java,eclipse,swt,jface,blink,Java,Eclipse,Swt,Jface,Blink,我想知道有人知道如何解决这个问题: 在我的JavaEclipse插件中,有一些过程需要一些时间。因此,用户可以最小化窗口,让进程在后台运行。 现在,当这个过程结束时,我可以强迫窗口再次到达顶部,但这在可用性方面是一个禁忌。我更希望进程在任务栏中闪烁。有什么办法可以做到这一点吗? 我看了一下,但找不到类似的东西,SWT文档也是如此… 我想到的另一件事是,当人们在mac os x和linux上使用该应用程序时,是否有一个平台无关的解决方案,它会通知用户该过程已经完成,但不会将窗口置于顶部? 欢迎提

我想知道有人知道如何解决这个问题: 在我的JavaEclipse插件中,有一些过程需要一些时间。因此,用户可以最小化窗口,让进程在后台运行。
现在,当这个过程结束时,我可以强迫窗口再次到达顶部,但这在可用性方面是一个禁忌。我更希望进程在任务栏中闪烁。有什么办法可以做到这一点吗? 我看了一下,但找不到类似的东西,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")