题
我正在开发一个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具体的事情。
不隶属于 StackOverflow