2011-08-06 42 views
12

Quiero agregar un botón (JButton) en la parte inferior de un JDialog que debe cerrar el JDialog cuando se lo presiona. El problema es que no sé qué escribir en el ActionListener de ese botón. No quiero que el botón salga del programa, solo cierre el cuadro de diálogo.Botón para cerrar un JDialog

El JDialog se crea llamando explícitamente a uno de los constructores de JDialog, no llamando a uno de los métodos de JOptionPane.

Estaba muy sorprendido de que no haya podido encontrar una respuesta a esto usando Google. Esperaba que un problema que a menudo se descubría estuviera ampliamente cubierto en muchos sitios de programación. Bastante raro que no lo es.

+0

Bueno, nunca he usado un JDialog antes de hoy. Y miré ese javadoc unas pocas docenas de veces (necesitaba ver qué métodos contenía). Pero no vi nada sobre cerrarlo. – SoboLAN

+1

@SoboLAN dos métodos: 'dispose()' & 'setVisible (false)' –

Respuesta

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

public class YourDialog extends JDialog implements ActionListener { 

    JButton button; 

    public YourDialog() { 
    button = new JButton("Close"); 
    button.addActionListener(this); 
    add(button); 
    pack(); 
    setVisible(true); 
    } 

    public void actionPerformed(ActionEvent e) { 
     dispose(); 
    } 
} 
  • Cierre solamente dialolg usando marco padre dispose() método no se ha cerrado. razón por la cual la JVM no terminó.

+0

Creo que disponer() es la mejor manera de hacerlo. Gracias, ahora tengo todo lo que necesito. – SoboLAN

5

En el método de ActionListeneractionPerformed() que querrá algo como:

dialog.setVisible(false); 

Si desea deshacerse del cuadro de diálogo de forma permanente (liberarla de la memoria), entonces lo haría también llamada:

dialog.dispose(); 

... donde diálogo es el nombre de su cuadro de diálogo. Si dialog es una variable local, deberá hacer que sea definitiva para acceder de esta manera.

Si va a añadir el botón como parte de una subclase de JDialog (es decir, si usted tiene class MyDialog extends JDialog y va a añadir al oyente la acción en MyDialog) querrá:

MyDialog.this.setVisible(false); 
+0

Lo hice cuando creé el JDialog: dialog.SetDefaultCloseOperation (JDialog.DISPOSE_ON_CLOSE) ;. En el ActionListener llamé a estos 2 métodos: dialog.setVisible (false); dialog.dispatchEvent (new WindowEvent (diálogo, WindowEvent.WINDOW_CLOSING) ;. El JDialog se cierra, pero la forma en que lo hice es correcta? Gracias por su respuesta (sorprendentemente rápido), por cierto – SoboLAN

+0

@SoboLAN No se preocupe - sí, eso es el enfoque correcto. – berry120

+0

@ berry120 - Seguro que el diseño y los componentes de JDialog seguirán existiendo en la memoria con este método. Imagino que podría meterse en un lío grave haciendo esto regularmente. –

6

Usted puede tener el envío ActionListener a WindowEvent.WINDOW_CLOSING, como se muestra here.

+2

1, que distribuye el evento a la ventana todo permite cualquier código WindowListener para ser ejecutado. Por lo que vale, también puede consultar la clase 'ExitAction' que se encuentra en [Cerrar una aplicación] (http://tips4java.wordpress.com/2009/05/01/closing-an-application/). La acción es un poco más general ya que se puede usar con cualquier cuadro o diálogo. – camickr

+0

@camickr: 'ExitAction' parece una buena forma de garantizar que todas las salidas pasen por el' WindowListener'. – trashgod

Cuestiones relacionadas