2009-12-31 61 views
5

tôi đã thêm một người biết lắng nghe trạng thái cửa sổ như sau:sự kiện gần cửa sổ trong java

this.addWindowStateListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent e) { 
      ExitAction.getInstance().actionPerformed(null); 
     } 

    }); 

Nhưng khi tôi đang sử dụng các nút đóng X sự kiện này không được gọi. Tôi nghĩ rằng đó là một cái gì đó để làm với khuôn khổ jdesktop netbean. Nhưng tôi không thể tìm thấy những gì có thể là vấn đề. Cảm ơn sự giúp đỡ của bạn.

Trả lời

9

windowClosing là một phần của giao diện WindowListener. Sử dụng addWindowListener thay vì addWindowStateListener.

+2

+1. lưu ý rằng một 'WindowStateListener' được sử dụng để xử lý các sự kiện được kích hoạt khi cửa sổ được thu nhỏ hoặc phóng to, vv, nhưng không được đóng lại. – akf

3

Thông thường bạn sử dụng WindowListener cho việc này.

Kiểm tra Closing an Application để biết cách tiếp cận tôi sử dụng, mặc dù tôi phải thừa nhận rằng tôi chưa bao giờ thử với Netbeans vì tôi không sử dụng IDE.

0

Như tài liệu Java nói, để thực sự đóng cửa sổ, trình lắng nghe nên gọi phương thức vứt bỏ hoặc phương thức setVisible (false) của cửa sổ.

-2

Như những người khác đã chỉ ra các WindowListener là những gì bạn đang theo đuổi ... nhưng bạn nên làm điều này từ giờ trở đi khi trọng một phương pháp:

this.addWindowStateListener(
    new WindowAdapter() 
    { 
     @Overrides 
     public void windowClosing(WindowEvent e) 
     { 
      ExitAction.getInstance().actionPerformed(null); 
     } 

    }); 

Sau đó trình biên dịch sẽ thông báo cho bạn khi bạn đang không thực sự ghi đè phương thức và thay vào đó thêm phương thức mới (trong trường hợp này sẽ không bao giờ được gọi).

+0

WindowAdapter vừa là WindowListener vừa là WindowStateListener. Vấn đề ở đây là nó được thêm vào như là một WindowStateListener vì vậy các phương thức mà nó có như một WindowListener không được gọi. – lins314159

+0

ah đúng, tôi không biết nó thực hiện nhiều hơn WindowListener. Thật lạ lùng ... dường như họ đã thêm vào điều đó trong 1,4. Trước 1.4, nếu Java có chú thích, những gì tôi đã nói sẽ làm việc :-) (không xóa câu trả lời vì nó có giá trị như một quy tắc chung không chỉ trong trường hợp cụ thể này) – TofuBeer

3

Không trả lời trực tiếp câu hỏi của bạn (vì câu trả lời đã được đưa ra), nhưng tôi cho rằng bạn muốn thoát khỏi chương trình của mình (hoặc chỉ ẩn cửa sổ) khi thoát. Có giải pháp ngắn hơn cho những trường hợp này:

window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
0

Cảm ơn tất cả mọi người đã giúp tôi giải quyết vấn đề. Tôi không hoàn toàn nhấn mạnh nó nhưng mã sau giải quyết vấn đề:

Frame[] frames = Frame.getFrames(); 
    for(Frame f: frames){ 
     f.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       ExitAction.getInstance().actionPerformed(null); 
      } 

     }); 
    } 

Dường như khuôn khổ thêm khung hình bổ sung. Cảm ơn,

1

Chỉ cần gỡ rối một sự cố tương tự trong chương trình Swing của tôi. Nó hóa ra là một lỗi Java mà giết chết các sự kiện giao diện người dùng hệ thống khi ImageIO được gọi trước khi giao diện người dùng Swing được tạo ra. Xem ở đây cho một ví dụ rất nhỏ -

https://stackoverflow.com/questions/18964138/osx-specific-new-java-ui-bug-reproducable-java-imageio-close-window-event-bug

lỗi này dừng các sự kiện hệ thống giao diện người dùng, chẳng hạn như cửa sổ đóng, được gửi tới Java.

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