在JFrame关闭时终止正在运行的线程
当用户关闭JFrame
窗口时,如何调用额外的操作? 我必须停止现有的线程。
据我了解, setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
导致框架关闭并且其线程停止。 是否应该在JFrame.EXIT_ON_CLOSE
之后关闭线程?
客户:
static boolean TERMINATE = false; public static void main(String[] args) { // some threads created while(true) { if(TERMINATE){ // do before frame closed break; } } } private static JPanel startGUI(){ JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel gui = new JPanel(); f.add( gui); f.setSize(500,500); f.setVisible(true); return gui; }
我需要关闭线程正在使用的套接字。 这样做的最佳做法是什么?
使用JFrame.EXIT_ON_CLOSE
实际上终止了JVM( System.exit
)。 所有正在运行的线程将自动停止。
如果要在JFrame
即将关闭时执行某些操作,请使用WindowListener
。
JFrame frame = ... frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { // close sockets, etc } });
-
您必须将
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 == 0) { System.exit(1); } } }; 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 == 0) { System.exit(1); } } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { ClosingFrame cf = new ClosingFrame(); } }); } }
您可以在JFrame上设置默认关闭操作
JFrame frame = new JFrame("My Frame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);