Search code examples
javaswingjframeactionevent

Java hide JFrame that is being extended by a class with the click of a button


import javax.swing.JFrame;

public class Choose extends javax.swing.JFrame {

/**
 * Creates new form NewJFrame
 */
public Choose() {
    initComponents();
}


@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    LoginButton = new javax.swing.JButton();
    Create = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setTitle("Family Entertainment Center");

    LoginButton.setFont(new java.awt.Font("Tahoma", 1, 24)); // NOI18N
    LoginButton.setText("Login");
    LoginButton.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            LoginButtonActionPerformed(evt);
        }
    });

    Create.setFont(new java.awt.Font("Tahoma", 1, 24)); // NOI18N
    Create.setText("Create Account");
    Create.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            CreateActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(34, 34, 34)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(Create, javax.swing.GroupLayout.PREFERRED_SIZE, 327, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(LoginButton, javax.swing.GroupLayout.PREFERRED_SIZE, 327, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addContainerGap(39, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addContainerGap(68, Short.MAX_VALUE)
            .addComponent(Create, javax.swing.GroupLayout.PREFERRED_SIZE, 52, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(49, 49, 49)
            .addComponent(LoginButton, javax.swing.GroupLayout.PREFERRED_SIZE, 52, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(79, 79, 79))
    );

    pack();
}// </editor-fold>                        

public static void CreateActionPerformed(java.awt.event.ActionEvent evt) {                                         
    JFrame frame = new CreateLogin();
    frame.setVisible(true);
}                                        

public static void LoginButtonActionPerformed(java.awt.event.ActionEvent evt) {                                         
    JFrame frame = new LoginFrame();
    frame.setVisible(true);
}

In the Action event listener above I want to hide this jframe while it creates the other jFrames. I have tried to instantiate and hide the jframe but that creates a new instance. I have also tried the "this.setVisible(false)" which also doesnt work.

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /* Set the Metal look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Metal".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(Choose.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(Choose.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(Choose.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(Choose.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new Choose().setVisible(true);
        }
    });
}

// Variables declaration - do not modify                     
public static javax.swing.JButton LoginButton;
public static javax.swing.JButton Create;
// End of variables declaration                   

}


Solution

  • Not sure if this is the best solution, but if you don't need them static, it should work to remove the static field from your CreateActionPerformed() and LoginButtonActionPerformed() methods. You can then call setVisible(false), because you're now calling from within your Choose instance.

    public void CreateActionPerformed(java.awt.event.ActionEvent evt) {
        JFrame frame = new CreateLogin();
        frame.setVisible(true);
        setVisible(false);
    }  
    

    You should be able to remove static from your JButtons as well.

    Hope this helps. :)

    Edit: See comment from Andrew.