Mam autonomiczną aplikację Java, która pobiera dane z bazy danych i wyświetla je w JTable. Po uruchomieniu aplikacji użytkownik jest proszony o podanie nazwy użytkownika/hasła w JDialogu. Po wprowadzeniu prawidłowych poświadczeń wyświetlana jest główna ramka JFrame zawierająca dane. W głównym oknie JFrame mam przycisk wylogowania, który po kliknięciu powinien zamknąć główną ramkę JFrame i ponownie wyświetlić JDialog logowania. Wszystko w większości działa, ale odkryłem, że główna ramka JFrame nie znika po kliknięciu przycisku wylogowania. Poniżej znajduje się mały przykład pracy mojego kodu: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);
}
}
W MainFrame.java jeśli zmienię linię, która mówi setVisible(false)
na dispose()
, JFrame zniknie po kliknięciu przycisku. Moje pytanie brzmi: dlaczego to działa z dispose()
, a nie z setVisible(false)
? Czy istnieje lepszy sposób na uporządkowanie mojego kodu? Jestem nowy w Swing, więc przepraszam, jeśli to podstawowe pytanie. Dziękuję Ci.
EDITED 2011-10-19 10:26 PDT
Dziękuję wszystkim za pomoc. Zmieniłem JDialog, aby mieć zerowego rodzica, a teraz wszystko działa tak, jak chciałem.
Dla lepszej pomocy prędzej, dodaj [SSCCE] (http: // pscode. org/sscce.html). –