【发布时间】:2009-01-28 20:44:40
【问题描述】:
我正在开发一个 Swing 应用程序,我需要刷新 Windows 任务栏。我不能使用frame.requestFocus(),因为我不想从任何其他应用程序中窃取焦点。
【问题讨论】:
我正在开发一个 Swing 应用程序,我需要刷新 Windows 任务栏。我不能使用frame.requestFocus(),因为我不想从任何其他应用程序中窃取焦点。
【问题讨论】:
我不知道它是否适用于较新版本的 Windows,但 .toFront() 方法用于在当前 VM 的窗口都不在前台时刷新窗口。
这意味着在最小化的框架上调用 frame.toFront() 总是会使其闪烁...
【讨论】:
JNIWrapper with its winpack extension 可以为所欲为。
网站上的演示展示了它的实际效果。
【讨论】:
您可以强制最小化您的 GUI 和.toFront-zh:
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 调用来了解问题的真正根源。使用干净的 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任务栏实现闪现还有问题,请告诉我!
【讨论】:
最好的方法:
if (!isFocused()) {
setVisible(false);
setVisible(true);
}
【讨论】:
使用 Swing 本身,你很可能不能;那是 Windows 特有的东西。
【讨论】: