Windowsには、ウィンドウがフォーカスを盗むのを防ぐ機能があります。代わりに、タスクバーアイコンが点滅します。XPではデフォルトでオンになっています(変更できるのはTweakUIを使用している唯一の場所ですが、どこかにレジストリ設定があります)。Vistaでは、既定の設定を変更したり、すぐに使えるUIを使用してユーザーがアクセスできる設定として公開したりする場合があります。
ウィンドウが自分自身を前面に押し込んでフォーカスを取得するのを防ぐことは、Windows 2K以降の機能です(私は1つは感謝しています)。
とは言っても、作業中に自分のアクティビティを記録するように通知するために使用する小さなJavaアプリがあり、それ自体が30分ごとにアクティブウィンドウになります(もちろん、構成可能です)。それは常にWindows XPの下で一貫して動作し、タイトルバーウィンドウを点滅させることはありません。タイマーイベントの発生の結果としてUIスレッドで呼び出される次のコードを使用します。
if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
toFront();
repaint();
(最小化すると最初の行が復元されます...実際には最大化した場合にも復元されますが、私はそうはしません)。
私は通常、このアプリを最小化していますが、多くの場合、テキストエディターの背後にあるだけです。そして、私が言ったように、それは常に機能します。
私はあなたの問題が何であるかについての考えを持っています-おそらくあなたはsetVisible()呼び出しで競合状態を持っています。toFront()は、ウィンドウが呼び出されたときにウィンドウが実際に表示されない限り有効ではない場合があります。以前にrequestFocus()でこの問題がありました。ウィンドウアクティブ化イベントのUIリスナーにtoFront()呼び出しを配置する必要がある場合があります。
2014-09-07:ある時点で、おそらくJava 6または7で上記のコードが機能しなくなった。調査と実験を行った後、ウィンドウのtoFront
メソッドをオーバーライドするためにコードを更新する必要があった(変更されたコードと組み合わせて)上にあります):
setVisible(true);
toFront();
requestFocus();
repaint();
...
public @Override void toFront() {
int sta = super.getExtendedState() & ~JFrame.ICONIFIED & JFrame.NORMAL;
super.setExtendedState(sta);
super.setAlwaysOnTop(true);
super.toFront();
super.requestFocus();
super.setAlwaysOnTop(false);
}
Java 8_20以降、このコードは正常に動作しているようです。