Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
jFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
Теперь немного объясним. Ближайшим эквивалентом, как видно в вопросе, является ..
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Но это убивает всю JRE независимо от других не-демона, которые работают. Если они запущены, они должны быть закрыты или очищены явно.
Если нет других потоков, не связанных с daemon, DISPOSE_ON_CLOSE
будет располагать текущую JFrame
и завершать виртуальную машину.
Если вы говорите о JButton
, который хотите поместить в свою форму, вы хотите вызвать JFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)
в своем конструкторе для формы, а затем ваш обработчик кнопки может вызвать
dispose()
, чтобы закрыть форму.
EXIT_ON_CLOSE
- плохая практика. См. Мой ответ для деталей.
– Andrew Thompson
22 August 2014 в 13:18
Очень простой ответ - это @Andrew Thompson.
jFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
ИЛИ
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
, и если u хочет сделать это по-другому с помощью кода. то u может поместить этот код в любом месте. в событиях.
System.exit (0);
надеюсь, что это поможет.
@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);
}
}
Если вы хотите создать кнопку, которая выйдет из приложения, когда пользователь нажмет на нее, попробуйте следующее:
JButton exit = new JButton("exit");
ActionListener al = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
};
exit.addActionListener(al);
Теперь, когда вы нажмете на эту кнопку, приложение выйдет.
JFrame.EXIT_ON_CLOSE
просто отлично, если вы обрабатываете очистку в переопределеннойJFrame.processWindowEvent(WindowEvent)
проверке событийWindowEvent.WINDOW_CLOSING
. – predi 22 August 2014 в 13:38