如何使用Swing刷新Windows任务栏?

时间:2009-01-28 20:44:40

标签: java swing taskbar

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

5 个答案:

答案 0 :(得分:12)

我不知道它是否适用于较新版本的Windows,但如果当前VM的窗口都不在前台,则用于闪存窗口的.toFront()方法。

这意味着在最小化的帧上调用frame.toFront()将始终使其闪烁...

答案 1 :(得分:4)

JNIWrapper with its winpack extension可以做你想做的事。

网站上的演示显示了它的实际效果。

答案 2 :(得分:1)

您可以强制最小化您的GUI和.toFront - en it:

        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来了解问题的真正根源。使用干净的Java代码无法调用dll,您需要其他编程语言的帮助,例如,与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任务栏中实现闪烁,请告诉我们!

答案 3 :(得分:0)

最好的方法:

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

答案 4 :(得分:-1)

使用Swing本身,你很可能不会;这是Windows特有的。