eventos - jdialog modal java ejemplo
¿Cómo cierro un JDialog y hago que se notifique a los oyentes de los eventos de Windows? (5)
Despachar un evento de cierre de ventana a la ventana. Consulte el ejemplo ExitAction de la entrada Cerrando una aplicación .
¿Hay alguna manera de cerrar un código JDialog a través de un código tal que los oyentes de eventos de Windows todavía recibirán una notificación? Intenté simplemente configurar visible para false y deshacerme, pero ninguno parece hacerlo.
No parece tener tu problema. Cuando uso el código debajo de windowDeactivated() se llama setVisible (false) o dispose() y windowClosed() también se llama para disponer ().
ClosingDialog.java:
public class ClosingDialog extends JDialog {
public ClosingDialog(Frame owner, String title, boolean modal) {
super(owner, title, modal);
JPanel contentPanel = (JPanel) this.getContentPane();
JButton setVisButton = new JButton("setVisible( false )");
setVisButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ClosingDialog.this.setVisible(false);
}
});
JButton disposeButton = new JButton("dispose()");
disposeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ClosingDialog.this.dispose();
}
});
contentPanel.setLayout(new FlowLayout());
contentPanel.add(setVisButton);
contentPanel.add(disposeButton);
this.addWindowListener(new WindowListener() {
public void windowActivated(WindowEvent e) {
System.out.println("windowActivated");
}
public void windowClosed(WindowEvent e) {
System.out.println("windowClosed");
}
public void windowClosing(WindowEvent e) {
System.out.println("windowClosing");
}
public void windowDeactivated(WindowEvent e) {
System.out.println("windowDeactivated");
}
public void windowDeiconified(WindowEvent e) {
System.out.println("windowDeiconified");
}
public void windowIconified(WindowEvent e) {
System.out.println("windowIconified");
}
public void windowOpened(WindowEvent e) {
System.out.println("windowOpened");
}
});
this.setSize(300, 300);
}
}
Quería windowClosing
un evento de windowClosing
desde el código (como si el usuario windowClosing
clic en la X), porque tengo un botón de cierre adicional en el JDialog y quiero que el mismo WindowListener (que implementé usando un WindowAdapter
) se ejecute cuando la X se hace clic y cuando se hace clic en el botón. La ejecución de dispose()
solo windowClosed
la ventana cerrada, no el windowClosing
, y quiero que aparezca un mensaje antes de que se cierre la ventana, para su confirmación. Tampoco windowClosing
disparar windowClosing
mediante el método processWindowEvent
ya que está protegido.
Así es como lo hice funcionar:
WindowAdapter adapter = (WindowAdapter)jdialog.getWindowListeners()[0];
adapter.windowClosing(new WindowEvent((Window)jdialog, WindowEvent.WINDOW_CLOSING));
Espero que ayude a alguien.
Sugerencia no probada:
¿Has probado getWindowListeners () y luego iterando para disparar windowClosed () a cada uno de los WindowListeners?
EDITAR: la sugerencia anterior es incorrecta. Manteniéndolo para la posteridad.
Me temo que llamar a dialog.dispose () funciona bien para mí en mi simple ejemplo.
Cerrar una ventana (con dispose()
) y ocultarla (con setVisible(false)
) son operaciones diferentes, y producen diferentes eventos, y cerrarlo desde el sistema operativo es otra operación diferente que produce un evento diferente.
Los tres producirán windowDeactivated
para indicarle el foco perdido de la ventana, pero dispose()
producirá windowClosed
, mientras que cerrar desde el sistema operativo producirá primero windowClosing
. Si desea manejar ambos de la misma manera, puede configurar la ventana para que se elimine cuando se cierre:
window.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
En general, setVisible(false)
implica que es posible que desee utilizar la ventana de nuevo, por lo que no publica ningún evento de ventana (aparte de windowDeactivated
). Si desea detectar el ocultamiento de una ventana, necesita usar un ComponentListener
;
window.addComponentListener(new ComponentAdapter() {
@Override
public void componentHidden(ComponentEvent e) {
System.out.println("componentHidden()");
}
})
Sin embargo, tenga en cuenta que esto solo funcionará para setVisible()
explícitas de setVisible()
. Si necesita detectar el ocultamiento de manera más general, puede usar un HierarchyListener
, pero probablemente sea más problemático de lo que vale.
window.addHierarchyListener(new HierarchyListener() {
@Override
public void hierarchyChanged(HierarchyEvent e) {
System.out.println("valid: " + window.isValid());
System.out.println("showing: " + window.isShowing());
}
});
Tenga en cuenta que cuando disponga de una ventana obtendrá un par de HierarchyEvent
s, primero para ocultar y luego para la invalidación, pero cuando lo oculte con setVisible()
sigue siendo válido, por lo que no obtendrá la invalidación.