Windows, pencerelerin odağı çalmasını engelleme özelliğine sahiptir; bunun yerine görev çubuğu simgesini yanıp söner. XP'de varsayılan olarak açıktır (bunu değiştirmek için gördüğüm tek yer TweakUI kullanıyor, ancak bir yerde bir kayıt defteri ayarı var). Vista'da varsayılanı değiştirmiş olabilirler ve / veya kutudan çıkar çıkmaz UI ile kullanıcı tarafından erişilebilen bir ayar olarak sunmuş olabilirler.
Pencerelerin kendilerini öne doğru zorlamasını ve odaklanmasını önlemek, Windows 2K'dan beri bir özellik (ve bunun için minnettarım).
Bununla birlikte, çalışırken aktivitelerimi kaydetmemi hatırlatmak için kullandığım küçük bir Java uygulamam var ve her 30 dakikada bir aktif pencere yapıyor (tabii ki yapılandırılabilir). Windows XP altında her zaman tutarlı bir şekilde çalışır ve başlık çubuğu penceresini hiçbir zaman yanıp sönmez. Bir timer olayı tetiklemesinin bir sonucu olarak UI iş parçacığında çağrılan aşağıdaki kodu kullanır:
if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
toFront();
repaint();
(küçültüldüğünde ilk satır geri yüklenir ... aslında büyütüldüğünde onu da geri yüklerdi, ama ben buna asla sahip değilim).
Genelde bu uygulamayı küçülttüğüm halde, çoğu zaman metin editörümün arkasında. Ve dediğim gibi, her zaman işe yarar.
Probleminizin ne olabileceğine dair bir fikrim var - belki de setVisible () çağrısıyla bir yarış durumunuz var. toFront (), çağrıldığında pencere gerçekten görüntülenmedikçe geçerli olmayabilir; Bu sorunu daha önce requestFocus () ile yaşadım. ToFront () çağrısını, pencere tarafından etkinleştirilen bir olaydaki bir UI dinleyicisine koymanız gerekebilir.
2014-09-07: Bir noktada, yukarıdaki kod çalışmayı durdurdu, belki Java 6 veya 7'de. Biraz araştırma ve denemeden sonra, pencerenin toFront
yöntemini geçersiz kılmak için kodu güncellemem gerekiyordu (değiştirilmiş kodla birlikte yukarıda):
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'den itibaren, bu kod iyi çalışıyor gibi görünüyor.