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