Tengo una aplicación Java independiente que obtiene datos de una base de datos y los muestra en una JTable. Cuando se inicia la aplicación, se le solicita al usuario un nombre de usuario/contraseña en un JDialog. Una vez que se ingresan las credenciales correctas, se visualiza el JFrame principal que contiene los datos. En el JFrame principal, tengo un botón de cerrar sesión que, al hacer clic, debe cerrar el JFrame principal y volver a mostrar el JDialog de inicio de sesión. Todo funciona principalmente, excepto que he encontrado que el JFrame principal no desaparece cuando se hace clic en el botón de cerrar sesión. A continuación se muestra un pequeño ejemplo de trabajo de mi código:Java Swing dispose() frente a setVisible (falso)
Main.java:
import javax.swing.SwingUtilities;
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MainFrame();
}
});
}
}
MainFrame.java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class MainFrame extends JFrame implements ActionListener {
private JButton button;
private MyDialog dialog;
public MainFrame() {
super("this is the JFrame");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
dialog = new MyDialog(this);
button = new JButton("click me to hide this JFrame and display JDialog");
button.addActionListener(this);
add(button);
pack();
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
setVisible(false); // works when changed to dispose();
dialog.setVisible(true);
}
}
MyDialog.java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
public class MyDialog extends JDialog implements ActionListener {
private JFrame parentFrame;
private JButton button;
public MyDialog(JFrame parentFrame) {
super(parentFrame, "this is the JDialog", true);
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
this.parentFrame = parentFrame;
button = new JButton("click me to hide JDialog and show JFrame");
button.addActionListener(this);
add(button);
pack();
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
setVisible(false);
parentFrame.setVisible(true);
}
}
En MainFrame.java si cambio la línea que dice setVisible(false)
a dispose()
, entonces el JFrame desaparece cuando hago clic en el botón. Mi pregunta es, ¿por qué funciona esto con dispose()
y no con setVisible(false)
? ¿Hay una mejor manera de organizar mi código? Soy nuevo en Swing, así que me disculpo si esta es una pregunta básica. Gracias.
EDITADO 2011-10-19 10:26 PDT
Gracias a todos por su ayuda. Cambié el JDialog para tener un padre nulo y ahora todo funciona como yo quería.
Para una mejor ayuda antes, publique un [SSCCE] (http: // pscode. org/sscce.html). –