Windows มีสิ่งอำนวยความสะดวกในการป้องกันไม่ให้หน้าต่างขโมยโฟกัส แต่จะกะพริบไอคอนแถบงาน ใน XP จะเปิดโดยค่าเริ่มต้น (ที่เดียวที่ฉันเคยเห็นการเปลี่ยนแปลงคือใช้ TweakUI แต่มีการตั้งค่ารีจิสทรีอยู่ที่ใดที่หนึ่ง) ใน Vista พวกเขาอาจเปลี่ยนค่าเริ่มต้นและ / หรือเปิดเผยว่าเป็นการตั้งค่าที่ผู้ใช้สามารถเข้าถึงได้ด้วย UI ที่พร้อมใช้งาน
การป้องกันไม่ให้หน้าต่างบังคับตัวเองไปด้านหน้าและการโฟกัสเป็นคุณสมบัติตั้งแต่ Windows 2K (และฉันขอขอบคุณสำหรับสิ่งนี้)
ที่กล่าวว่าฉันมีแอป Java เล็กน้อยที่ฉันใช้เพื่อเตือนให้ฉันบันทึกกิจกรรมของฉันในขณะที่ทำงานและทำให้ตัวเองเป็นหน้าต่างที่ใช้งานอยู่ทุกๆ 30 นาที (แน่นอนว่ากำหนดค่าได้) ทำงานอย่างสม่ำเสมอภายใต้ Windows XP และไม่กะพริบหน้าต่างแถบหัวเรื่อง ใช้รหัสต่อไปนี้เรียกว่าในเธรด UI อันเป็นผลมาจากการเริ่มทำงานของเหตุการณ์จับเวลา:
if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
toFront();
repaint();
(บรรทัดแรกจะคืนค่าหากย่อให้เล็กสุด ... อันที่จริงมันจะคืนค่าหากขยายใหญ่สุด แต่ฉันไม่เคยมี)
ในขณะที่ฉันมักจะย่อแอปนี้ให้เล็กที่สุด แต่บ่อยครั้งมันอยู่หลังโปรแกรมแก้ไขข้อความของฉัน และอย่างที่ฉันพูดมันได้ผลเสมอ
ฉันมีความคิดว่าปัญหาของคุณคืออะไร - บางทีคุณอาจมีเงื่อนไขการแข่งขันกับการโทร setVisible () toFront () อาจไม่ถูกต้องเว้นแต่หน้าต่างจะปรากฏขึ้นจริงเมื่อถูกเรียก ฉันเคยมีปัญหากับ requestFocus () มาก่อน คุณอาจต้องวางการโทร toFront () ในตัวฟัง UI ในเหตุการณ์ที่เปิดใช้งานหน้าต่าง
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 ดูเหมือนว่าโค้ดนี้จะใช้งานได้ดี