4

我有一个 Swing 应用程序,用户可以在其中创建和保存文档。该应用程序被部署为一个简单的 Jar 文件。

主要目标平台是 Windows Vista。

如果用户在应用程序中有打开且未保存的文档,并且用户正在从 Windows Vista 机器注销,我想停止注销过程并询问用户是否要在 Java 应用程序之前保存到文档终止。

是否可以从 Java 应用程序停止 Windows Vista 上的注销过程?

我试过关机钩子没有成功。

4

2 回答 2

3

是否可以从 Java 应用程序停止 Windows Vista 上的注销过程?

不,也不应该是可能的。这就像摇狗的尾巴一样。

于 2012-04-10T07:36:59.150 回答
3

编辑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关闭,我明白了..

Windows 拒绝关闭

更有趣的是,在我点击Cancel(哎呀,“寻找不明飞行物”是播放器中的下一个排队曲目,我不打算重新安排它:) 之后,我无法点击帧。似乎它被一个不可见的模态对话框阻止了。我必须杀死虚拟机才能摆脱它。

于 2012-04-10T07:38:56.843 回答