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);
}
}
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
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ổ. –
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