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