私はJavaを実践するためにワードプロセッサアプリケーションを作成しています。ユーザーがアプリケーションを終了しようとすると、JFrameが変更を保存するよう求められます。setDefaultCloseOperationを使用して、代わりにJFrameを表示する
私はsetDefaultCloseOperation()について考えていましたが、これまで少し運がありました。また、可能であれば、ユーザーがウィンドウの右上にある「X」をクリックしても表示されるようにしたいと思います。
私はJavaを実践するためにワードプロセッサアプリケーションを作成しています。ユーザーがアプリケーションを終了しようとすると、JFrameが変更を保存するよう求められます。setDefaultCloseOperationを使用して、代わりにJFrameを表示する
私はsetDefaultCloseOperation()について考えていましたが、これまで少し運がありました。また、可能であれば、ユーザーがウィンドウの右上にある「X」をクリックしても表示されるようにしたいと思います。
JFrame DefaultCloseOperationをDO_NOTHINGのように設定してから、WindowsListenerを設定してcloseイベントを取得し、必要な操作を行うことができます。私は数分で例を掲示します。
EDIT:ここでは例です:
public static void main(String[] args) {
final JFrame frame = new JFrame("Test Frame");
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setSize(800, 600);
frame.addWindowListener(new WindowAdapter() {
//I skipped unused callbacks for readability
@Override
public void windowClosing(WindowEvent e) {
if(JOptionPane.showConfirmDialog(frame, "Are you sure ?") == JOptionPane.OK_OPTION){
frame.setVisible(false);
frame.dispose();
}
}
});
frame.setVisible(true);
}
あなたはJFrame
にWindowListener
を追加する必要があります。
windowClosing
メソッドでは、必要なコードを入力できます。例えば
:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ClosingFrame extends JFrame {
private JMenuBar MenuBar = new JMenuBar();
private JFrame frame = new JFrame();
private static final long serialVersionUID = 1L;
private JMenu File = new JMenu("File");
private JMenuItem Exit = new JMenuItem("Exit");
public ClosingFrame() {
File.add(Exit);
MenuBar.add(File);
Exit.addActionListener(new ExitListener());
WindowListener exitListener = new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
int confirm = JOptionPane.showOptionDialog(frame,
"Are You Sure to Close this Application?",
"Exit Confirmation", JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE, null, null, null);
if (confirm == JOptionPane.OK_OPTION) {
System.exit(0);
}
}
};
frame.addWindowListener(exitListener);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setJMenuBar(MenuBar);
frame.setPreferredSize(new Dimension(400, 300));
frame.setLocation(100, 100);
frame.pack();
frame.setVisible(true);
}
private class ExitListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
int confirm = JOptionPane.showOptionDialog(frame,
"Are You Sure to Close this Application?",
"Exit Confirmation", JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE, null, null, null);
if (confirm == JOptionPane.OK_OPTION) {
System.exit(0);
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ClosingFrame cf = new ClosingFrame();
}
});
}
}
import java.awt.event.*;
import javax.swing.*;
public class QuickGuiTest {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
final JFrame frame = new JFrame("Test Frame");
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setSize(600, 400);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
int result = JOptionPane.showConfirmDialog(
frame, "Are you sure?");
if(result==JOptionPane.OK_OPTION){
// NOW we change it to dispose on close..
frame.setDefaultCloseOperation(
JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(false);
frame.dispose();
}
}
});
frame.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
1)ITYM 'frame.addWindowListener(新しいWindowAdapterを(){'(それ以外の場合は、コンパイルエラーである)2)JREは、以降に終了しません。 EDTはまだ実行中です。まれに 'System.exit(0)'を呼び出す必要があるかもしれません。 –
@AndrewThompson System.exit(0)の代わりにアプリケーションを閉じる最も安全な方法をお勧めします。 ? – Andrei0427
さて、まず実行中のスレッドを見て、まだ実行中のEDTだけであることを確認してください。もしそうなら、 'System.exit(0)'を使ってJVMを終了することはかなり安全です。しかし、ここでより良い解決策があります。私の答えをご覧ください。 –