Swing アプリケーションを開発していて、Windows タスクバーをフラッシュする必要があります。frame.requestFocus()
他のアプリケーションからフォーカスを奪いたくないので使えません。
5 に答える
新しいバージョンの Windows に適用されるかどうかはわかりませんが、.toFront() メソッドは、現在の VM のウィンドウがフォアグラウンドにない場合にウィンドウをフラッシュするために使用されていました。
これは、最小化されたフレームで frame.toFront() を呼び出すと、常にフラッシュすることを意味します...
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!!
悲しいことに、アクティブなウィンドウからフォーカスが削除されます。アクティブなウィンドウを見つけて、後で再度アクティブにすることができます。それでも、点滅は約 3 秒間しか持続しません。
...または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 タスクバーの点滅に問題がある場合は、お知らせください。
Swing自体を使用すると、おそらくできません。それはWidnows特有のものです。