7

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;
        }

スレッドが動作しているソケットを閉じる必要があります。それを行うためのベストプラクティスは何ですか?

4

3 に答える 3

10

を使用するJFrame.EXIT_ON_CLOSEと、実際にJVMが終了します(System.exit)。実行中のすべてのスレッドは自動的に停止します。

aが閉じようとしているときに何らかのアクションを実行する場合JFrameは、を使用しWindowListenerます。

JFrame frame = ...
frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
        // close sockets, etc
    }
});
于 2012-06-03T20:24:23.443 に答える
3
  • にを追加する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();
            }
        });
    }
}
于 2012-06-03T20:26:33.230 に答える
1

JFrameでデフォルトのクローズ操作を設定できます

JFrame frame = new JFrame("My Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
于 2016-06-23T17:06:23.377 に答える