setDefaultCloseOperation代替显示JFrame

我正在制作一个文字处理器应用程序,以便练习Java,我希望它能够在用户尝试关闭应用程序时,JFrame将要求保存更改。

我在考虑setDefaultCloseOperation()但到目前为止我运气不佳。 如果可能的话,我还希望用户点击窗口右上角的“X”。

您可以将JFrame DefaultCloseOperation设置为DO_NOTHING,然后设置WindowsListener以获取close事件并执行您想要的操作。 我会在几分钟内发布一个例子。

编辑:这是一个例子:

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); } 
 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); } } 
  • 您必须将WindowListener添加到JFrame

  • 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(); } }); } }