Windows には、ウィンドウがフォーカスを盗むのを防ぐ機能があります。代わりに、タスクバー アイコンが点滅します。XP ではデフォルトでオンになっています (私が見た唯一の変更箇所は TweakUI の使用ですが、どこかにレジストリ設定があります)。Vista では、デフォルトが変更されているか、すぐに使用できる UI を使用してユーザーがアクセス可能な設定として公開されている可能性があります。
ウィンドウが強制的に最前面に移動してフォーカスを取得するのを防ぐことは、Windows 2K 以降の機能です (私はその機能に感謝しています)。
とはいえ、私は小さな 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 の時点で、このコードは正常に動作しているようです。