Ashford Tulgaa
Ashford Tulgaa

Reputation: 29

JFrame doesn't dispose()

So, I have a login JFrame which shows up when I run the code. The problem is if the user enters the correct userName and password this login frame needs to be disposed when the other frame is shown up but it doesn't. I tried dispose(), setVisible = false, but still no chance to be hidden or disposed.

 class LoggingWindow extends JFrame {


  static JFrame loginFrame = new JFrame();   
  JPanel loginPanel = new JPanel();
  JTextField loginNameFld = new JTextField(10);
  JPasswordField loginPassFld = new JPasswordField(10);
  JTextField statusFld = new JTextField(11);
  String userName = "user";
  String password = "password";

  //Initialize loginFrame 

   public static void initLoginFrame() {     
    JFrame loginWindow = new LoggingWindow();
    //loginFrame.setTitle("\"Moflo Registration\"");
    loginWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    loginWindow.setResizable(false);
    loginWindow.setUndecorated(true);
    loginWindow.setVisible(true);
    loginWindow.getRootPane().setWindowDecorationStyle(JRootPane.NONE);
    loginWindow.setSize(new Dimension(220, 290));
    loginWindow.setLocationRelativeTo(null);
    loginWindow.pack();

   LoggingWindow() {

        loginFrame.add(loginPanel);
        loginPanel.setLayout(new GridBagLayout());
        GridBagConstraints gbb = new GridBagConstraints();
        gbb.insets = new Insets(1, 1, 1, 1);
        gbb.anchor = GridBagConstraints.CENTER;


        JPanel loginNameAndPasswordPanel = new JPanel();
        loginPanel.add(loginNameAndPasswordPanel,gbb);
        gbb.gridx = 0;
        gbb.gridy = 2;


        loginNameAndPasswordPanel.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.LINE_END;
        gbc.insets = new Insets(0,0,0,0);

        JLabel loginNameLab = new JLabel("Нэр :           ");
        gbc.gridx = 0;
        gbc.gridy = 0;
        loginNameAndPasswordPanel.add(loginNameLab, gbc);

        JLabel loginPassLab = new JLabel("Нууц үг :     ");
        gbc.gridx = 0;
        gbc.gridy = 1;
        loginNameAndPasswordPanel.add(loginPassLab, gbc);

        loginNameFld.setHorizontalAlignment(JTextField.CENTER);
        gbc.gridx = 1;
        gbc.gridy = 0;
        loginNameAndPasswordPanel.add(loginNameFld, gbc);

        loginPassFld.setHorizontalAlignment(JTextField.CENTER);
        gbc.gridx = 1;
        gbc.gridy = 1;
        loginNameAndPasswordPanel.add(loginPassFld, gbc);

        statusFld.setEditable(false);

        loginNameAndPasswordPanel.add(statusFld, gbc);
        statusFld.setHorizontalAlignment(JTextField.CENTER);

        JPanel buttonsPanel = new JPanel();
        loginPanel.add(buttonsPanel,gbb);
        gbb.gridx = 0;
        gbb.gridy = 3;  
        buttonsPanel.setLayout(new GridBagLayout());
        GridBagConstraints gba = new GridBagConstraints();
        gba.anchor = GridBagConstraints.LINE_END;
        gba.insets = new Insets(2, 2, 2, 2);

        JButton loginBtn = new JButton("Нэвтрэх");
        gba.gridx = 0;
        gba.gridy = 0;
        buttonsPanel.add(loginBtn, gba);     

        loginBtn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {

        String name = loginNameFld.getText();
        String pass = loginPassFld.getText();

    if(event.getSource() == loginBtn){
    if (name.equals(userName) && pass.equals(password)) {
                  initMainFrame();
                  loginFrame.dispose(); 
    JOptionPane.showMessageDialog(null, "Системд нэвтэрлээ. Өнөөдөр " + showDate, " ", JOptionPane.INFORMATION_MESSAGE);

    } else {
        statusFld.setText("Нэр эсвэл нууц үг буруу байна.");
    }

        }
        }
    }); 

        JButton closeBtn = new JButton("       Хаах    ");
        gba.gridx = 1;
        gba.gridy = 0;
        buttonsPanel.add(closeBtn, gba);
        add(loginPanel);
        closeBtn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            System.exit(0);
        }
    }); 
}
            //Main method
public static void main(String[] args) {

   SwingUtilities.invokeLater(new Runnable() {
   @Override
   public void run() {

       initLoginFrame();
     }
    });
   }
  }

  public class MainFrame extends JFrame {

 //Initialzie mainFrame
public static void initMainFrame() {
    JFrame mainFrame = new MainFrame();


    mainFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
    mainFrame.setVisible(true);
    mainFrame.setExtendedState(Frame.MAXIMIZED_BOTH);
    mainFrame.setMinimumSize(new Dimension(800, 600));
    mainFrame.setLocationRelativeTo(null);
}

some, i think unimportant statements are not shown for the sake of brevity

Upvotes: 0

Views: 392

Answers (3)

Nick Ziebert
Nick Ziebert

Reputation: 1268

I believe you confused "loginWindow" with "loginFrame". You try to use

loginFrame.dispose(); 

but your content is on loginWindow, not loginFrame.

I was able to get it to dispose the username window doing the following.

static JFrame loginWindow;  <--- create as class variable, not local.
//loginFrame.add(loginPanel);  <--- doesn't appear that this is actually used

if(event.getSource() == loginBtn){
                    if (name.equals(userName) && pass.equals(password)) {
                        MainFrame.initMainFrame();
                        //loginFrame.dispose();    <--- again, not used
                        loginWindow.dispose();     <--- want to dispose
                        JOptionPane.showMessageDialog(null, "Системд нэвтэрлээ. Өнөөдөр " , " ", JOptionPane.INFORMATION_MESSAGE);

                    } else {
                        statusFld.setText("Нэр эсвэл нууц үг буруу байна.");
                    }

                }

You must also change this:

JFrame loginWindow = new LoggingWindow(); 

to:

 loginWindow = new LoggingWindow();

Upvotes: 1

Ashford Tulgaa
Ashford Tulgaa

Reputation: 29

I definitely confused with loginFrame was indeed useless. I created a class variable: static JFrame loginWindow; but it results NullPointerException.

Upvotes: 0

Preston Garno
Preston Garno

Reputation: 1225

You can always dispatch the "close" event to the JFrame object:

loginFrame.dispatchEvent(new WindowEvent(loginFrame, WindowEvent.WINDOW_CLOSING));

Upvotes: 0

Related Questions