2010-10-23 41 views
5

Tôi muốn kích hoạt ứng dụng Swing của mình theo chương trình. Tôi có nghĩa là tôi muốn viết mã mà gây ra các JFrame để được nhìn thấy và tập trung (tiêu đề cửa sổ nên được đánh dấu). Tôi đã cố sử dụng requestFocus(). Nó chỉ hoạt động nếu ứng dụng có ít nhất 2 cửa sổ A và B: A bị ẩn, B hiển thị. Bây giờ nếu tôi gọi A.requestFocus() nó sẽ hoạt động như tôi muốn. Nó không xảy ra nếu ứng dụng chỉ có một cửa sổ hoặc nếu cả hai cửa sổ đều ẩn.Làm thế nào để kích hoạt cửa sổ trong Java?

Tôi đã tìm thấy 2 cách giải quyết.

  1. sử dụng khung không được trang trí trong suốt giả luôn ở trên cùng. Cửa sổ giả này sẽ đóng vai trò của cửa sổ B. Tôi không cố gắng thực hiện nó nhưng có vẻ như nó sẽ hoạt động.
  2. gọi A.setAlwaysOnTop(true). Điều này mang lại cửa sổ A trên đầu trang của các cửa sổ khác. Nhưng nó vẫn chưa được tập trung. Sử dụng java.awt.Robot (mouseMove, mousePress, mouseRelease) để thực hiện một nhấp chuột vào tiêu đề của cửa sổ A. Bây giờ gọi A.setAlwaysOnTop(false) và đưa con trỏ chuột trở lại vị trí trước đó của nó. Tôi đã triển khai mã và nó hoạt động nhưng trông giống như một giải pháp xấu.

Có giải pháp "đúng" không?

Trả lời

1

Tôi tin rằng this bài sẽ giúp bạn.

1

này nên làm điều đó:

frame.setSelected(true); 

và có thể bạn muốn nó bên trong một khối try/catch ...

Nếu điều đó không làm việc trên hệ điều hành bạn đang sử dụng, có hơn hai khả năng:

frame.setAlwaysOnTop(true); 
frame.setAlwaysOnTop(false); 

frame.setVisible(true); 
frame.setVisible(true); // Yes you need this second one 
+0

Theo như tôi có thể nói không có 'phương pháp Frame.setSelected' –

+0

nó trong JInternalFrame –

+0

Vâng, setSelected() chết không tồn tại cho đến nay ... – AlexR

5
frame.setState(Frame.NORMAL); // restores minimized windows 
frame.toFront(); // brings to front without needing to setAlwaysOnTop 
frame.requestFocus(); 

cho tất cả mọi thứ bạn có thể muốn biết chi tiết dữ dội, xem trang này: http://www.developer.com/java/other/article.php/3502181/Window-Focus-and-State-in-Java.htm

+0

toFront() có ý nghĩa. Cảm ơn bạn! – AlexR

+0

Sử dụng 'requestFocusInWindow' thay vì' requestFocus', xem http://download.oracle.com/javase/tutorial/uiswing/misc/focus.html. –

+0

@Geoffrey - không ... đó là để tập trung các thành phần * bên trong * của cửa sổ, không phải là chính cửa sổ. Có thể là một liên kết tốt cho anh ta để kiểm tra xem anh ta vẫn còn có vấn đề mặc dù. –

1

Tôi đã ở cùng một thuyền - không có hoạt động nào ở trên.

"TÔI" giải pháp được sau:

thisFrame.getWindowListeners()[0].windowActivated(
    new WindowEvent(
       thisFrame, 
       WindowEvent.WINDOW_ACTIVATED 
    ) 
); 
schedulesTable.requestFocus(); 

thisFrame = the window to get activated 

schedulesTable = my component in the window I wanted to get focus for 
+0

Cảm ơn. Mặc dù tôi đã hỏi câu hỏi này nhiều năm trước và dự án đó là không liên quan bây giờ tôi có thể sẽ thử giải pháp của bạn. – AlexR

Các vấn đề liên quan