8

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

4

5 回答 5

13

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

这意味着在最小化的框架上调用 frame.toFront() 总是会使其闪烁......

于 2009-01-28T21:01:57.013 回答
4

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

网站上的演示展示了它的实际应用。

于 2009-01-28T21:03:09.603 回答
1

您可以强制最小化您的 GUI 并.toFront-en 它:

        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!!

遗憾的是,这会将焦点从活动窗口中移除。您可以找出活动窗口并在之后重新激活它。但是,闪烁只会持续大约三秒钟。

...或者通过使用DLL -call on找到问题的真正根源FlashWindow。使用干净的 Java 代码无法调用 dll,您将需要其他编程语言的帮助,例如JNA。除此之外,您还可以用另一种语言编写自己的程序并从您的 Java 应用程序中调用它。我将在下面的 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 任务栏中实现闪烁仍然有问题,请告诉我!

于 2015-01-04T02:55:39.870 回答
0

最好的方法是:

if (!isFocused()) {
        setVisible(false);
        setVisible(true);
    }
于 2016-04-13T10:49:24.330 回答
-1

使用 Swing 本身,你很可能不能;这是 Windowws 特有的事情。

于 2009-01-28T21:04:29.897 回答