Windows memiliki fasilitas untuk mencegah jendela mencuri fokus; sebagai gantinya, ikon taskbar berkedip. Di XP, ini aktif secara default (satu-satunya tempat yang saya lihat untuk mengubahnya adalah menggunakan TweakUI, tetapi ada pengaturan registri di suatu tempat). Di Vista mereka mungkin telah mengubah default dan / atau mengeksposnya sebagai pengaturan yang dapat diakses pengguna dengan UI out-of-the-box.
Mencegah jendela memaksakan diri ke depan dan mengambil fokus adalah fitur sejak Windows 2K (dan saya, untuk satu, berterima kasih untuk itu).
Meskipun demikian, saya memiliki sedikit aplikasi Java yang saya gunakan untuk mengingatkan saya merekam aktivitas saya saat bekerja, dan itu membuat jendela aktif setiap 30 menit (dapat dikonfigurasi, tentu saja). Itu selalu bekerja secara konsisten di bawah Windows XP dan tidak pernah mem-flash jendela bilah judul. Ini menggunakan kode berikut, yang dipanggil di thread UI sebagai hasil dari pengaktifan peristiwa timer:
if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
toFront();
repaint();
(baris pertama mengembalikan jika diminimalkan ... sebenarnya itu akan mengembalikannya jika dimaksimalkan juga, tapi saya tidak pernah memilikinya).
Meskipun saya biasanya memiliki aplikasi ini diminimalkan, cukup sering itu hanya di belakang editor teks saya. Dan, seperti yang saya katakan, itu selalu berhasil.
Saya memiliki ide tentang apa masalah Anda - mungkin Anda memiliki kondisi balapan dengan panggilan setVisible (). toFront () mungkin tidak valid kecuali jika jendela benar-benar ditampilkan saat dipanggil; Saya pernah mengalami masalah ini dengan requestFocus () sebelumnya. Anda mungkin perlu menempatkan panggilan toFront () di pendengar UI pada peristiwa jendela yang diaktifkan.
2014-09-07: Pada suatu saat kode di atas berhenti bekerja, mungkin di Java 6 atau 7. Setelah beberapa penyelidikan dan eksperimen, saya harus memperbarui kode untuk mengganti metode jendela toFront
lakukan ini (sehubungan dengan kode yang dimodifikasi dari apa di atas):
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);
}
Pada Java 8_20, kode ini tampaknya berfungsi dengan baik.