2011-01-25 38 views
13

Tôi đang viết một ứng dụng Java (Swing GUI) định kỳ bật lên một JFrame.Có thể mang JFrame về phía trước nhưng KHÔNG tập trung?

Có thể nào đó để đưa cửa sổ lên phía trước (foo.setAlwaysOnTop (true) thậm chí còn tốt hơn) nhưng mà không có có tập trung không?

Một số người thỉnh thoảng rời mắt khỏi màn hình để xem bàn phím của họ và tôi chắc chắn rằng nếu cửa sổ này luôn thu hút người dùng bàn phím thì sẽ rất khó chịu vì nó khiến họ mất một vài lần nhấn phím mỗi lần bật lên không được chú ý.

Trong các trường hợp khác, ngay cả khi người dùng thực sự có khả năng nhập mà không cần nhìn vào bàn phím mọi lúc, cửa sổ bật lên và lấy nét có thể gây ra các hành động không mong muốn từ cửa sổ bật lên (một số Tab + Enter kết hợp ví dụ, nơi người dùng vô tình chọn một tùy chọn mà cô ấy thực sự sẽ không chọn nếu không).

Cảm ơn trước!

Cập nhật

Như Jonas thấy, foo.setFocusableWindowState(false); dường như có tác dụng nếu được gọi sau khi cửa sổ đã được trả lại (thử nghiệm trên Gnome chỉ).

này không hoạt động:

foo.setFocusableWindowState(false); 
foo.setVisible(true); 
foo.setFocusableWindowState(true); 

Tuy nhiên, này không:

foo.setFocusableWindowState(false); 
foo.setVisible(true); 
Thread.sleep(1000); 
foo.setFocusableWindowState(true); 

tôi sẽ phải để xem nếu có một sự kiện tôi có thể bắt/nghe cho phép tôi làm foo.setFocusableWindowStatue(true); khi thích hợp.

Tôi xem vấn đề của mình đã được giải quyết.

+1

bạn đã bao giờ tìm thấy một sự kiện để lắng nghe khi khung được hiển thị? – lordoku

+0

Có ai từng tìm một sự kiện để nghe ở đây hoạt động không? – wrslatz

Trả lời

13

này có thể làm việc:

foo.setFocusableWindowState(false); 
+0

Điều này thực sự có vẻ làm việc, nhưng tôi sẽ hoặc là phải thiết lập một bộ đếm thời gian hoặc tìm một số sự kiện để lắng nghe khi cho phép tôi làm 'setFocusableWindowState' trở lại' true'. –

+0

@Johann bạn cũng có thể thử sử dụng 'Window' thay vì' JFrame'. Tôi nghĩ rằng bạn có nhiều khả năng để kiểm soát tập trung sau đó. – Jonas

0

Góp ý: Trong phần GUI tạo Frame, đặt 2 cuộc gọi liên tiếp:

frameJustCreated.requestFocus(); 
this.requestFocus(); 

1st một mang lại cửa sổ của JFrame mới đầu trang , Thứ hai giữ cửa sổ nơi người dùng đang gõ ở trên cùng.

+0

Tôi rất tiếc! Tôi nên nói rằng đây là cửa sổ duy nhất mà chương trình của tôi chịu trách nhiệm. Cửa sổ "khác" chỉ là các chương trình khác mà người dùng đang chạy .. –

1

Gần đây tôi đã chạy vào cùng một vấn đề, và giải pháp dự kiến ​​đã được:

JFrame frame = ...; 
frame.setExtendedState(JFrame.NORMAL); 
frame.setAlwaysOnTop(true); 
frame.requestFocus(); 
frame.setAlwaysOnTop(false); 
+0

hoạt động nếu chỉ có một JFrame và không có bất kỳ Tác vụ nền nào, vui lòng bắt đầu chủ đề của riêng bạn (nếu bạn muốn có liên kết đến chủ đề này), quá khó để thực hiện điều đó mà không setVisible (true/flase), nhưng hành động này có thể nhìn thấy trên màn hình, câu trả lời là sử dụng JDialog, chỉ có vậy (nghĩa là Windows OS) bạn có thể làm điều đó mà không có vấn đề thứ cấp – mKorbel

+1

, vì tôi có nhiều JFrames đang chạy trong ứng dụng của mình. Tại sao bắt đầu một chuỗi mới khi người dùng mô tả cùng một vấn đề chính xác như tôi đang gặp phải, nhưng giải pháp chưa hoàn thành? Đối với JDialog, nó không phải lúc nào cũng phù hợp với mục đích của cửa sổ, cũng là trường hợp của tôi. –

+0

có thể tôi làm điều đó mà không nhấp nháy, nhưng mã này dài hơn chủ đề này, thực sự không tốt, đừng chuyển Focus betweens hai hoặc nhiều JFrames, mang một JFrame sang một khung khác, Focus (giống như JFrame hoặc JDialog) từ Hệ điều hành gốc và không đồng bộ, sau đó rất khó quản lý, – mKorbel

2

Tính đến Java 1,7 bạn có thể gọi

frame.setAutoRequestFocus(false); 
0

Nếu bạn muốn gọi setFocusableWindowState (true) trong một sự kiện (do đó, không chờ đợi ví dụ 1 giây), bạn có thể thêm WindowListener (ví dụ: bắt nguồn từ WindowAdapter) để thay đổi thuộc tính:

appFrame.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowOpened(WindowEvent e) { 
      super.windowOpened(e); 
      e.getWindow().setFocusableWindowState(true); 
     } 
    }); 

    appFrame.setFocusableWindowState(false); 
    appFrame.setVisible(true); 
Các vấn đề liên quan