EDIT2
对于那些跟随讨论的人,我留下了我的第一个答案,但似乎他们没有工作。首先找到我的真正解决方案
好吧,所以我认为这实际上有效,但它并不完全可以接受,因为它使用了受限制的API部分(但它自Java 1.3以来就存在并且仍然存在于Java 1.7中)。它使用sun.misc.Signal。大部分代码最初由Andrew Thompson发布。
import java.awt.AWTEvent;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import sun.misc.Signal;
import sun.misc.SignalHandler;
class TestShutDown {
static final String WINDOW_MODIFIED = "windowModified";
TestShutDown() {
final JFrame f = new JFrame("Log Off!");
f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent we) {
System.err.println("Window closing");
handleQuit(f);
}
});
Signal.handle(new Signal("TERM"), new SignalHandler() {
@Override
public void handle(Signal arg0) {
handleQuit(f);
}
});
// bad practice, but not the point..
f.setSize(400, 200);
f.setLocationByPlatform(true);
f.setVisible(true);
}
protected static void handleQuit(final JFrame f) {
int result = JOptionPane.showConfirmDialog(f, "Close Me");
if (result == JOptionPane.OK_OPTION) {
System.exit(0);
}
}
public static void main(String[] args) {
// start the GUI on the EDT
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestShutDown();
}
});
}
}
解决方案早期建议(不要在LOGOFF上工作)
我假设您正在使用带有JFrame的GUI应用程序。
在您的JFrame中,设置以下内容:
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);然后,在您的JFrame上注册WindowAdapter。覆盖windowClosing()方法并从那里打开一个阻止对话框,询问用户他想做什么(是/否/取消)。如果他选择,是的,你保存然后丢弃框架,如果他选择否,你只需丢弃框架。如果他选择取消,你什么都不做。
编辑:
这里有一些代码和更多关于我正在解释的内容以及Andrew Thompson带来的细节。以下所有学分应归他所有:
使用此代码:
import java.awt.event.*;
import javax.swing.*;
class TestShutDown {
TestShutDown() {
final JFrame f = new JFrame("Log Off!");
f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
f.addWindowListener( new WindowAdapter() {
@Override
public void windowClosing(WindowEvent we) {
int result = JOptionPane.showConfirmDialog(f, "Close Me");
if (result==JOptionPane.OK_OPTION) {
System.exit(0);
}
}
});
// bad practice, but not the point..
f.setSize(400,200);
f.setLocationByPlatform(true);
f.setVisible(true);
}
public static void main(String[] args) {
// start the GUI on the EDT
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestShutDown();
}
});
}
}然后告诉Windows关闭,我看到..
更有趣的是,在我点击取消 kbd>之后(哎呀,'搜索UFO'是播放器中的下一个排队轨道,而我不打算重新安排它:),我无法点击框架。似乎它被一个看不见的模态对话框阻挡了。我不得不杀死VM以摆脱它。