una - Java: ¿cómo evito que WindowClosing realmente cierre la ventana?
ventana de confirmacion java (7)
¡No estoy seguro de dónde está tu problema, pero esto funciona para mí!
frame.addWindowListener (new WindowAdapter () {
public void windowClosing(WindowEvent evt){
int res=JOptionPane.showConfirmDialog(null,
"Do you want to exit.?");
if(res==JOptionPane.YES_OPTION){
Cal.this.dispose();
}
}
});
Parece que tengo el problema inverso para la mayoría de las personas. Tengo el siguiente código bastante estándar para ver si el usuario quiere hacer algunas copias antes de cerrar la ventana:
frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent ev) {
boolean close = true;
// check some files, asking if the user wants to save
// YES and NO handle OK, but if the user hits Cancel on any file,
// I want to abort the close process
// So if any of them hit Cancel, I set "close" to false
if (close) {
frame.dispose();
System.exit(0);
}
}
});
No importa lo que intente, la ventana siempre se cierra cuando salgo de la ventanaCerrar. Cambiar WindowAdapter a WindowListener no hace ninguna diferencia. Lo que es extraño es que la documentación dice explícitamente "Si el programa no oculta o descarta explícitamente la ventana mientras se procesa este evento, la operación de cierre de la ventana se cancelará", pero no funciona de esa manera para mí. ¿Hay alguna otra forma de manejar la x en el marco? TIA
Acabo de probar este caso de prueba mínima:
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class test {
public static void main(String[] args) {
final JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent ev) {
//frame.dispose();
}
});
frame.setVisible(true);
}
}
Si mantengo la llamada a la disposición final comentada, y presiono el botón de cerrar, la ventana no se cierra. Descomenta eso y presiona el botón Cerrar, la ventana se cierra.
Tendría que adivinar que algo está mal en tu lógica para establecer tu variable "cercana". Intenta verificarlo dos veces.
El método setDefaultCloseOperation () ayuda en el problema. https://chortle.ccsu.edu/java5/Notes/chap56/ch56_9.html
ver este enlace
Esta es la clave, me parece: frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
Marca la diferencia en el caso de prueba que cociné.
Para el manejo de esto, hazlo:
si el usuario selecciona sí, entonces use setDefaultCloseOperation(DISPOSE_ON_CLOSE);
dentro de las llaves de eso if else
si se selecciona una cancelación, utilice setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
Considera un ejemplo:
int safe = JOptionPane.showConfirmDialog(null, "titleDetails!", "title!!", JOptionPane.YES_NO_CANCEL_OPTION);
if(safe == JOptionPane.YES_OPTION){
setDefaultCloseOperation(DISPOSE_ON_CLOSE);//yes
} else if (safe == JOptionPane.CANCEL_OPTION) {
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);//cancel
} else {
setDefaultCloseOperation(DISPOSE_ON_CLOSE);//no
}
Para resolver el mismo problema, probé la primera respuesta de este artículo. Como aplicación separada, funciona, pero no en mi caso. Quizás la diferencia esté en JFrame (en respuesta) y FrameView (mi caso).
public class MyApp extends SingleFrameApplication { // application class of my project
...
protected static MyView mainForm; // main form of application
...
}
public class MyView extends FrameView {
...
//Adding this listener solves the problem.
MyApp.getInstance().addExitListener(new ExitListener() {
@Override
public boolean canExit(EventObject event) {
boolean res = false;
int reply = JOptionPane.showConfirmDialog(null,
"Are You sure?", "", JOptionPane.YES_NO_OPTION);
if (reply == JOptionPane.YES_OPTION) {
res = true;
}
return res;
}
@Override
public void willExit(EventObject event) {
}
});
...
}
no estoy seguro de dónde está tu problema,
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 == JOptionPane.YES_OPTION) {
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 == JOptionPane.YES_OPTION) {
System.exit(1);
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ClosingFrame cf = new ClosingFrame();
}
});
}
}