Windows має можливість запобігти крадіжці вікон у фокусі; замість цього блимає значок на панелі завдань. У XP він увімкнений за замовчуванням (єдине місце, яке я бачив, щоб змінити, - це використання TweakUI, але десь є параметр реєстру). У Vista вони, можливо, змінили за замовчуванням та / або виставили його як налаштування, доступні користувачеві, за допомогою готового інтерфейсу користувача.
Запобігання змушенню вікон рухатись спереду та фокусуванню є особливістю, оскільки Windows 2K (і я, в першу чергу, вдячний за це).
Тим не менш, у мене є невеликий додаток Java, який я використовую, щоб нагадувати мені про запис своєї діяльності під час роботи, і він робить себе активним вікном кожні 30 хвилин (звичайно, що налаштовується). Він завжди працює стабільно під Windows XP і ніколи не блимає у вікні рядка заголовка. Він використовує наступний код, викликаний в потоці інтерфейсу користувача в результаті запуску події таймера:
if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
toFront();
repaint();
(перший рядок відновлює, якщо його згорнути ... насправді він відновив би його, якщо розгорнутий теж, але у мене ніколи цього немає).
Хоча у мене зазвичай цей додаток згорнутий, досить часто він просто стоїть позаду мого текстового редактора. І, як я вже сказав, це завжди працює.
Я маю уявлення про те, якою може бути ваша проблема - можливо, у вас є умова перегонів із викликом setVisible (). toFront () може бути недійсним, якщо вікно фактично не відображається під час його виклику; У мене раніше була проблема з requestFocus (). Можливо, вам доведеться помістити виклик 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, цей код, здається, працює нормально.