В 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, этот код, похоже, работает нормально.