我正在开发一个Swing应用程序,我需要闪光的Windows任务栏。我不能使用frame.requestFocus()因为我不希望从任何其他应用程序窃取的焦点。

有帮助吗?

解决方案

我不知道它是否适用于新版本的Windows,而是用来刷新窗口,如果没有当前VM的窗户都是在前台.toFront()方法。

这意味着,一个最小化的帧调用上frame.toFront()将总是使其闪烁...

其他提示

JNIWrapper其winpack扩展可以做你想做的。

网站上的演示示出了它的实际运行。

您可以强制,尽量减少你的GUI和.toFront恩吧:

        Gui.frame.setState(Frame.ICONIFIED);
        for (int i = 0; i < 3; i++) {
            Thread.sleep(10);
            Gui.frame.toFront();
            Thread.sleep(10);
            Gui.frame.setVisible(false);
            Thread.sleep(10);
            Gui.frame.toBack();
            Thread.sleep(10);
            Gui.frame.setVisible(true);
        }
        // be creative!!

其中可悲将从活动窗口移除的焦点。你可以找出活动窗口,之后重新激活它。但尽管如此,闪烁只会持续约三秒钟。

...或是通过FlashWindow一个 DLL -call踏踏实实的事情真正根源。调用的DLL是不可能用干净的Java代码,你需要其他编程语言的帮助下,可能例如与 JNA 。除此之外,你还可以用另一种语言编写自己的程序,并在Java应用程序中调用它。我给在AutoHotkey的一个例子如下:

AutoHotkey的代码:

    if 0 != 1       ; note: in ahk, 1 corresponds args[1] and 0 corresponds args.length
    {
        msgbox, There needs to be ONE parameter passed over to this file, which is the name of the window that should be flashed.
        ExitApp
    }
    programName = %1%
    winget, hWnd, ID, %programName%
    DllCall("FlashWindow",UInt,hWnd,Int,True)

编译成一个名为flash.exe,把你的Java工作目录下的文件,你可以从任何函数调用它:

    Runtime.getRuntime().exec("./flash.exe \"" + MyJFrame.getTitle() + "\"");

另外,可以使用的AutoHotkey.dll和Javacode(有关于如何做到这一点在互联网上指南)中访问它,所以会是不需要任何外部exe文件。

如果您仍然有实现在Windows任务栏上的闪烁问题,请让我知道!

要做到这一点,最好的方法:

if (!isFocused()) {
        setVisible(false);
        setVisible(true);
    }

使用Swing的本身,你很有可能不能;这是一个Windows具体的事情。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top