2012-11-07 23 views
6

Tôi có một vấn đề mà tại sao "windowClosed" phương pháp không được viện dẫn trong mã thử nghiệm của tôi như sau,Tại sao windowClosed không được gọi, ai có thể cho tôi biết thêm một chút về điều này?

import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.JFrame; 

public class Tmp { 

    class TFrame extends JFrame{ 
     private static final long serialVersionUID = -5729542298504858399L; 

     public TFrame() { 
      setTitle("title"); 
      setSize(300, 300); 
     } 
    } 


    public static void main(String[] args) { 
     final TFrame t = new Tmp().new TFrame(); 
     t.addWindowStateListener(new WindowAdapter() { 
      @Override 
      public void windowStateChanged(WindowEvent e) { 
       super.windowStateChanged(e); 
       System.out.println(e.getOldState() + "<-old new->" + e.getNewState()); 
      } 
     }); 
     t.addWindowListener(new WindowAdapter() { 

      @Override 
      public void windowClosed(WindowEvent e) { 
       super.windowClosed(e); 
       System.out.println(e.getID() + "closed " + e.getNewState()); 
      } 

      @Override 
      public void windowClosing(WindowEvent e) { 
       super.windowClosing(e); 
       System.out.println(e.getID() + "closing" + e.getNewState()); 
      } 
     }); 
     t.setVisible(true); 
    } 
} 

Nếu tôi viết setDefaultCloseOperation statement (JFrame.DISPOSE_ON_CLOSE) hoặc dứt khoát gọi vứt bỏ() để TFrame, windowClosed() sẽ được gọi.

Có ai có thể giải thích chi tiết hơn không, tôi nhầm lẫn cách viết thuộc tính của người nghe đối với windowClosed(), cảm ơn trước.

////////////////// cập nhật theo một số hướng dẫn từ Dan //////////////

import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.JFrame; 
import javax.swing.JOptionPane; 

public class Tmp { 

    class TFrame extends JFrame { 
     // ignored ..... 
     t.addWindowListener(new WindowAdapter() { 

      @Override 
      public void windowClosed(WindowEvent e) { 
       super.windowClosed(e); 
       System.out.println(e.getID() + "closed " + e.getNewState()); 
      } 

      @Override 
      public void windowClosing(WindowEvent e) { 
       super.windowClosing(e); 
       System.out.println(e.getID() + "closing" + e.getNewState()); 
       int quit = JOptionPane.showConfirmDialog(t, "Are you sure to quit?"); 
       if(quit == JOptionPane.YES_OPTION){ 
        t.dispose(); 
       } 
       else if (quit == JOptionPane.NO_OPTION){ 
        t.setVisible(false); 
       } 
      } 
     }); 
     t.setVisible(true); 
     t.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
    } 
} 

Trả lời

7

Giá trị mặc định cho setDefaultCloseOperationHIDE_ON_CLOSE. Với điều này, cửa sổ không đóng, nó chỉ bị ẩn.

Thay đổi giá trị thành thứ gì đó khác, bạn làm cho nó thực sự gần chứ không chỉ ẩn nó, vì vậy sự kiện sẽ được kích hoạt.

+1

cảm ơn câu trả lời của bạn, tôi đã kiểm tra setDefaultCloseOperation (..) trong JFrame.java, nó cho biết những gì bạn đã đăng :-). Một điều nữa tôi muốn đưa ra là tôi nên luôn luôn sử dụng "DISPOSE_ON_CLOSE" làm tham số nếu tôi muốn windowClosed() được gọi? Nó sẽ là tuyệt vời nếu một số hướng dẫn tốt đẹp và tài sản/đoạn mã được đưa ra. – vicd

+0

Nó phụ thuộc vào ngữ cảnh. Ví dụ, nếu bạn muốn người dùng được hỏi một cái gì đó trước khi đóng, bạn phải đặt nó là DO_NOTHING_ON_CLOSE và trên windowClosing hiển thị câu hỏi cho người dùng và sau đó vứt bỏ() cửa sổ. –

+0

Tôi hiểu điều đó, tôi đã viết một bản demo nhanh theo đề xuất của bạn, đó có phải là cách thực hiện đúng không? Vui lòng xem bài viết cập nhật :-) – vicd

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