Tôi có một ứng dụng Java độc lập lấy dữ liệu từ một cơ sở dữ liệu và hiển thị nó trong một JTable. Khi ứng dụng bắt đầu, người dùng được nhắc nhập tên người dùng/mật khẩu trong JDialog. Khi các thông tin đăng nhập chính xác được nhập, JFrame chính chứa dữ liệu được hiển thị. Trên JFrame chính tôi có một nút đăng xuất, khi được nhấp, nên đóng JFrame chính và hiển thị lại JDialog đăng nhập. Tất cả mọi thứ chủ yếu là làm việc ngoại trừ tôi đã thấy rằng JFrame chính không biến mất khi nút đăng xuất được nhấp. Dưới đây là một ví dụ nhỏ làm việc của mã của tôi:Java Swing vứt bỏ() so với 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);
}
}
Trong MainFrame.java nếu tôi thay đổi dòng ghi setVisible(false)
thành dispose()
thì JFrame sẽ biến mất khi tôi nhấp vào nút. Câu hỏi của tôi là, tại sao điều này làm việc với dispose()
và không phải với setVisible(false)
? Có cách nào tốt hơn để tôi tổ chức mã của tôi không? Tôi mới đến Swing nên tôi xin lỗi nếu đây là một câu hỏi cơ bản. Cảm ơn bạn.
EDITED 2011-10-19 10:26 PDT
Cảm ơn mọi người giúp đỡ của bạn. Tôi thay đổi JDialog để có một phụ huynh null và bây giờ tất cả mọi thứ hoạt động như tôi muốn.
Để được trợ giúp tốt hơn sớm hơn, gửi một [SSCCE] (http: // pscode. org/sscce.html). –