Близкий JFrame из процесса JButton остается живым - PullRequest
0 голосов
/ 14 октября 2011

У меня есть класс, разработанный с помощью windowbuilderpro, который я хочу закрыть также из JButton дальше, чем со стандартной кнопкой X на окне, поэтому вот пример класса:

public class MainWindow {

public JFrame frame;

public MainWindow() {
    initialize();
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  }

public void show() {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                //Show the main Frame
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }   
        }
    });
}

Когда я закрываю окно от кнопки X, окно закрывается правильно и процесс завершается.

Когда я закрываюсь вместо JButton, у которого есть этот слушатель:

mntmExit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
               //Close the application main form
               frame.setVisible(false);
               frame.dispose();
            }
        });

окно кадра закрывается правильно, но процесс остается активным ... Почему?

Process Alive

Как вы можете видеть, есть поток AWT-Shutdown, который запускается и завершается непрерывно. Как я могу добиться того же поведения кнопки X, которое также закрывает процесс приложения?

Примечания:

System.exit (0); не подходит, потому что это завершает приложение также, если есть другой фоновый запущенный поток, и я не хочу этого. Класс MainWindow должен закрывать и освобождать свой ресурс, то же самое поведение при закрытии приложения с помощью кнопки X, закрывающей экземпляр MainWindow, но если запущен фоновый поток, он не убивает их, а ждет, пока они закончат свою работу ...

Окружающая среда:

  • JDK 7
  • Затмение 3.7.1

Ответы [ 3 ]

2 голосов
/ 14 октября 2011

Все потоки в этом коде останавливаются при активации кнопки x или Exit.У тебя другое поведение?

import java.awt.event.*;
import javax.swing.*;

public class MainWindow {

    public JFrame frame;
    JButton mntmExit = new JButton("Exit");

    public MainWindow() {
        frame = new JFrame("Close Me!");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        mntmExit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //Close the application main form
                frame.setVisible(false);
                frame.dispose();
            }
        });
        frame.add(mntmExit);
        frame.pack();
        show();
    }

    public void show() {
        //Show the main Frame
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                MainWindow mw = new MainWindow();
                mw.show();
            }
        });
    }
}
2 голосов
/ 14 октября 2011

не уверен, что вам действительно нужно, похоже, что вы создаете новый JFrame снова и снова, не делайте этого, создайте JFrame один раз и повторно используйте этот контейнер

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // do nothing

frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); // same as setVisible(false)

, затем для васМожно только позвонить frame.setVisible(true);

для более удобного переопределения WindowListener , тогда вы можете контролировать некоторые события

0 голосов
/ 14 октября 2011

Просто добавьте одну строку:

System.exit(0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...