4

ユーザーがドキュメントを作成および保存できる Swing アプリケーションがあります。アプリケーションは単純な Jar ファイルとしてデプロイされます。

主なターゲット プラットフォームは Windows Vista です。

ユーザーがアプリケーションでドキュメントを開いて保存していない状態で、ユーザーが Windows Vista マシンからログアウトしている場合、ログオフ プロセスを停止し、Java アプリケーションが終了する前にドキュメントを保存するかどうかをユーザーに尋ねます。終了しました。

Windows Vista で Java アプリケーションからログオフ プロセスを停止することはできますか?

シャットダウンフックを試しましたが成功しませんでした。

4

2 に答える 2

3

EDIT2


議論に従った人のために、私が持っていた最初の答えを残しますが、うまくいかないようです. まず私の本当の解決策を見つけてください。

OK、これは実際に機能すると思いますが、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();
            }
        });
    }
}

以前に提案された解決策 (ログオフで機能しない)

を使用して GUI アプリケーションを使用していると仮定しています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(「Searching for UFOs」はプレイヤーの次のキューに入れられたトラックであり、スケジュールを変更するつもりはありませんでした :)、フレームをクリックできませんでした。目に見えないモーダル ダイアログでブロックされているように見えました。VM を削除するには、VM を強制終了する必要がありました。

于 2012-04-10T07:38:56.843 に答える
3

Windows Vista で Java アプリケーションからログオフ プロセスを停止することはできますか?

いいえ、それは可能であるべきではありません。それは、犬のしっぽを振るようなものです。

于 2012-04-10T07:36:59.150 に答える