6
我有一個問題,爲什麼「的windowClosed」法不被在我的測試代碼如下調用,爲什麼windowClosed沒有被調用,有人可以告訴我更多關於這個嗎?
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);
}
}
如果我寫的聲明setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)或顯式調用Dispose()來TFRAME, windowClosed()將被調用。
有沒有人可以更詳細地解釋它,我很困惑爲windowClosed()編寫監聽器的屬性方式,事先感謝。
//////////////////根據從丹//////////////
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);
}
}
感謝您的回答,我檢查了JFrame.java中的setDefaultCloseOperation(..),它告訴您發佈的內容:-)。還有一件事我想提出的是,如果我想調用windowClosed(),應該總是使用「DISPOSE_ON_CLOSE」作爲參數?如果給出一些不錯的和財產指南/代碼片段,那將是非常好的。 – vicd
這取決於上下文。例如,如果您想要在關閉之前向用戶提問,則必須將其設置爲DO_NOTHING_ON_CLOSE,並在windowClosing上顯示用戶的問題,然後處理()窗口。 –
我明白了,我根據你的建議寫了一個快速演示,是否正確的實現方式?請參閱更新的帖子:-) – vicd