Java WindowBuilder JMenu Элемент для закрытия приложения при щелчке мышью [дубликат]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

1
задан Andrew Thompson 22 August 2014 в 13:08
поделиться

5 ответов

jFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

Теперь немного объясним. Ближайшим эквивалентом, как видно в вопросе, является ..

jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Но это убивает всю JRE независимо от других не-демона, которые работают. Если они запущены, они должны быть закрыты или очищены явно.

Если нет других потоков, не связанных с daemon, DISPOSE_ON_CLOSE будет располагать текущую JFrame и завершать виртуальную машину.

9
ответ дан Andrew Thompson 18 August 2018 в 03:27
поделиться
  • 1
    +1 его правильный ответ – Krishna 22 August 2014 в 13:20
  • 2
    не согласен видеть там разницу для многих JFrame / JDialogs в одном экземпляре JVM (последний поворот света), JVM может оставаться живым после вызова JFrame.DISPOSE_ON_CLOSE, не так ли? – mKorbel 22 August 2014 в 13:31
  • 3
    +1, но для ответа, которые меня заставляют – mKorbel 22 August 2014 в 13:33
  • 4
    @mKorbel "JVM может оставаться в живых после того, как JFrame.DISPOSE_ON_CLOSE называется & quot; Конечно. Конечно, если он остается в живых после того, как последний элемент GUI закрыт, пришло время начать смотреть на то, что не позволяет JVM заканчиваться. – Andrew Thompson 22 August 2014 в 13:37
  • 5
    Я тоже не согласен. JFrame.EXIT_ON_CLOSE просто отлично, если вы обрабатываете очистку в переопределенной JFrame.processWindowEvent(WindowEvent) проверке событий WindowEvent.WINDOW_CLOSING. – predi 22 August 2014 в 13:38

Если вы говорите о JButton, который хотите поместить в свою форму, вы хотите вызвать JFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) в своем конструкторе для формы, а затем ваш обработчик кнопки может вызвать

dispose()

, чтобы закрыть форму.

0
ответ дан chiastic-security 18 August 2018 в 03:27
поделиться
  • 1
    Использование EXIT_ON_CLOSE - плохая практика. См. Мой ответ для деталей. – Andrew Thompson 22 August 2014 в 13:18
  • 2
    @AndrewThompson Да, вот что я имел в виду. Исправленный. – chiastic-security 22 August 2014 в 13:28

Очень простой ответ - это @Andrew Thompson.

jFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

ИЛИ

jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

, и если u хочет сделать это по-другому с помощью кода. то u может поместить этот код в любом месте. в событиях.

System.exit (0);

надеюсь, что это поможет.

0
ответ дан Krishna 18 August 2018 в 03:27
поделиться

@AndrewThompson прав насчет JFrame.EXIT_ON_CLOSE, но вы можете предпринять шаги, чтобы избежать просто убийства.

JFrame.EXIT_ON_CLOSE просто отлично, если вы обрабатываете очистку в переопределенной проверке JFrame.processWindowEvent(WindowEvent) для событий WindowEvent.WINDOW_CLOSING.

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.Timer;

public class ExitJFrame extends JFrame {

    public ExitJFrame() {
        setLayout(new BorderLayout());

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton button = new JButton("Exit");
        add(button);

        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ExitJFrame.this.processWindowEvent(
                        new WindowEvent(
                                ExitJFrame.this, WindowEvent.WINDOW_CLOSING));
            }
        });

        setSize(200, 200);
        setLocationRelativeTo(null);
    }

    @Override
    protected void processWindowEvent(WindowEvent e) {
        // more powerful as a WindowListener, since you can consume the event 
        // if you so please - asking the user if she really wants to exit for
        // example, do not delegate to super if consuming.
        if (e.getID() == WindowEvent.WINDOW_CLOSING) {
            doCleanup();
            super.processWindowEvent(e); 
        } else {        
            super.processWindowEvent(e); 
        }
    }

    private void doCleanup() {
        final JDialog dialog = new JDialog(this, true);
        dialog.setLayout(new BorderLayout());
        dialog.setUndecorated(true);
        JProgressBar progress = new JProgressBar();
        dialog.add(progress);
        dialog.add(new JLabel("Waiting for non-daemon threads to exit gracefully..."), BorderLayout.NORTH);
        progress.setIndeterminate(true);

        Timer timer = new Timer(2000, new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                dialog.setVisible(false);
                dialog.dispose();
            }
        });
        timer.setRepeats(false);
        timer.start();
        dialog.pack();
        dialog.setLocationRelativeTo(this);
        dialog.setVisible(true);
    }

    public static void main (String[] args) {
        new ExitJFrame().setVisible(true);
    }

}
2
ответ дан predi 18 August 2018 в 03:27
поделиться

Если вы хотите создать кнопку, которая выйдет из приложения, когда пользователь нажмет на нее, попробуйте следующее:

JButton exit = new JButton("exit");

ActionListener al = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.exit(0);
    }
};

exit.addActionListener(al);

Теперь, когда вы нажмете на эту кнопку, приложение выйдет.

0
ответ дан Radiodef 18 August 2018 в 03:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: