我有一个 Swing 应用程序,用户可以在其中创建和保存文档。该应用程序被部署为一个简单的 Jar 文件。
主要目标平台是 Windows Vista。
如果用户在应用程序中有打开且未保存的文档,并且用户正在从 Windows Vista 机器注销,我想停止注销过程并询问用户是否要在 Java 应用程序之前保存到文档终止。
是否可以从 Java 应用程序停止 Windows Vista 上的注销过程?
我试过关机钩子没有成功。
是否可以从 Java 应用程序停止 Windows Vista 上的注销过程?
不,也不应该是可能的。这就像摇狗的尾巴一样。
编辑2
对于那些关注讨论的人,我留下了我的第一个答案,但似乎它们不起作用。首先找到我真正的解决方案。
好的,所以我认为这确实有效,但它并不完全可以接受,因为它使用了 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();
}
});
}
}
先前建议的解决方案(在注销时不起作用)
我假设您正在使用带有JFrame
.
在您的JFrame
中,设置以下内容:
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
然后,WindowAdapter
在您的JFrame
. 覆盖该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关闭,我明白了..
更有趣的是,在我点击Cancel(哎呀,“寻找不明飞行物”是播放器中的下一个排队曲目,我不打算重新安排它:) 之后,我无法点击帧。似乎它被一个不可见的模态对话框阻止了。我必须杀死虚拟机才能摆脱它。