Windows có cơ sở để ngăn cửa sổ lấy cắp tiêu điểm; thay vào đó nó nhấp nháy biểu tượng trên thanh tác vụ. Trong XP nó là theo mặc định (nơi duy nhất tôi đã nhìn thấy để thay đổi nó là sử dụng TweakUI, nhưng có một thiết lập registry ở đâu đó). Trong Vista, họ có thể đã thay đổi mặc định và/hoặc hiển thị nó dưới dạng cài đặt có thể truy cập của người dùng với giao diện người dùng ngoài hộp.
Ngăn cửa sổ tự buộc mình ở phía trước và lấy nét là một tính năng kể từ Windows 2K (và tôi, vì một, rất biết ơn vì nó).
Điều đó nói rằng, tôi có một ứng dụng Java nhỏ tôi sử dụng để nhắc nhở tôi ghi lại các hoạt động của mình trong khi làm việc, và nó tự làm cho cửa sổ hoạt động sau mỗi 30 phút (có thể cấu hình, tất nhiên). Nó luôn hoạt động liên tục trong Windows XP và không bao giờ nhấp nháy cửa sổ thanh tiêu đề. Nó sử dụng đoạn mã sau, được gọi là trong thread UI như là kết quả của một bắn hẹn giờ sự kiện:
if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
toFront();
repaint();
(dòng đầu tiên khôi phục lại nếu giảm thiểu ... thực sự nó sẽ khôi phục lại nó nếu tối đa quá, nhưng tôi không bao giờ có nó như vậy).
Trong khi tôi thường có ứng dụng này được thu nhỏ, thường thì nó chỉ đơn giản là phía sau trình soạn thảo văn bản của tôi. Và, như tôi đã nói, nó luôn hoạt động.
Tôi có ý tưởng về vấn đề của bạn có thể là gì - có lẽ bạn có điều kiện chủng tộc với cuộc gọi setVisible(). toFront() có thể không hợp lệ trừ khi cửa sổ được hiển thị thực sự khi nó được gọi; Tôi đã gặp vấn đề này với requestFocus() trước đây. Bạn có thể cần phải thực hiện cuộc gọi toFront() trong trình nghe UI trên một sự kiện kích hoạt cửa sổ.
2014-09-07: Tại một số điểm trong thời gian mã trên ngừng làm việc, có lẽ tại Java 6 hoặc 7. Sau một số cuộc điều tra và thử nghiệm tôi đã phải cập nhật mã để ghi đè phương pháp của cửa sổ toFront
làm điều này (cùng với mã được sửa đổi từ những gì ở trên):
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);
}
Vì Java 8_20, mã này có vẻ hoạt động tốt.
bạn có một mẫu cho hành vi này? – OscarRyz
Câu trả lời đúng là gọi 'toFront()' trên EDT bằng cách sử dụng 'invokeLater'. Có một câu trả lời đơn giản bao gồm dưới đây, nhưng nó không phải là câu trả lời được chấp nhận. Nó hoạt động, mặc dù. Hoàn hảo. –
Tôi biết điều này là cũ, nhưng điều này cũng xảy ra trên OSX – ferdil