Possiedo un'applicazione Java autonoma che recupera i dati da un database e li visualizza in una tabella J. All'avvio dell'applicazione, all'utente viene richiesto un nome utente/password in un JDialog. Una volta inserite le credenziali corrette, viene visualizzato il JFrame principale contenente i dati. Sul JFrame principale ho un pulsante di disconnessione che, quando si fa clic, dovrebbe chiudere il JFrame principale e visualizzare di nuovo il JDialog di accesso. Tutto funziona per lo più tranne che ho scoperto che il JFrame principale non scompare quando si fa clic sul pulsante di disconnessione. Di seguito è riportato un piccolo esempio di lavoro del mio codice:Java Swing dispose() vs. setVisible (false)
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);
}
}
In MainFrame.java se cambio la linea che dice setVisible(false)
-dispose()
poi il JFrame va via quando clicco il bottone. La mia domanda è: perché funziona con dispose()
e non con setVisible(false)
? C'è un modo migliore per organizzare il mio codice? Sono nuovo di Swing quindi mi scuso se questa è una domanda di base. Grazie.
CURA 2011-10-19 10:26 PDT
Grazie a tutti per il vostro aiuto. Ho cambiato il JDialog per avere un genitore nullo e ora tutto funziona come volevo.
Per una migliore aiuto prima, inviare un [SSCCE] (http: // pscode. org/sscce.html). –