Skip to content
Advertisement

How can I set up a JFrame button to open another JFrame, and then receive information once the second jframe is closed?

This is part of a project for school, and I’m stuck and need someone to bounce ideas off of. I have a game where there is an option to sign up or sign in for a machine-local game so a record can be kept of the person’s scores. The game is run from a base GUI JFrame, and I want to make buttons to bring up secondary windows for the person to sign in or sign up, before closing out of them. I need to pass the validated username back to the initial GUI/game class so I can store it for the following game so the game score can be added under that user. I just need to pass the username back and I’m not sure how to go about it. This is the main GUI code up to where I’m having my issue:

public class MathFactsGUI extends JFrame
{

// instance variables
private JTextField problemJTextField, answerJTextField;
private JLabel equalJLabel;
private JButton  additionJButton, multiplicationJButton;
private JButton signupJButton, signinJButton; 
private JButton submitJButton;
private JLabel scoreJLabel,resultJLabel;
//private JButton reviewButton;
private String username;
private Userbase userbase;
private JLabel introJLabel;
Quiz quiz;

/**
 * Constructor for objects of class MathFactsGUI
 */
public MathFactsGUI()
{
    super("Math Facts Quiz");

    userbase = Userbase.getUserbase();
    username = "guest";
    /* code here has been removed to be abbreviated */

   // Action listener for buttons
    additionJButton.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
           quiz = new Quiz('+');
           problemJTextField.setText(quiz.getCurrentProblem());
           additionJButton.setEnabled(false);
           multiplicationJButton.setEnabled(false);
           signupJButton.setEnabled(false);
           signinJButton.setEnabled(false);
        }            
    }); 

    multiplicationJButton.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
           quiz = new Quiz('x');
           problemJTextField.setText(quiz.getCurrentProblem());
           additionJButton.setEnabled(false);
           multiplicationJButton.setEnabled(false);
           signupJButton.setEnabled(false);
           signinJButton.setEnabled(false);
        }            
    });

    signinJButton.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            JDialo
        }

    });

    signupJButton.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
           
            MathFactsSignUpGUI signUpGUI = new MathFactsSignUpGUI();
            gui.setVisible(true);
        
        }
    });
}

This is the JFrame I wrote for the sign-up button:

public class MathFactsSignUpGUI extends JDialog {
    private JTextField usernameJTextField, userPassJTextField, userFirstNameJTextField;
    private JLabel usernameJLabel, userPassJLabel, userFirstNameJLabel;
    private JButton  submitJButton;
    private String username;
    private String userPass;
    private String userFirstName;

    public MathFactsSignUpGUI(){
        usernameJLabel = new JLabel("Username:");
        usernameJTextField = new JTextField();

        userPassJLabel = new JLabel("Password:");
        userPassJTextField = new JTextField();

        userFirstNameJLabel = new JLabel("Player First Name:");
        userFirstNameJTextField = new JTextField();

        Box usernameBox = Box.createHorizontalBox();
        usernameBox.add(usernameJLabel);
        usernameBox.add(usernameJTextField);

        Box userPassBox = Box.createHorizontalBox();
        userPassBox.add(userPassJLabel);
        userPassBox.add(userPassJTextField);

        Box userFirstBox = Box.createHorizontalBox();
        userFirstBox.add(userFirstNameJLabel);
        userFirstBox.add(userFirstNameJTextField);

        submitJButton = new JButton("Submit");
        submitJButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                username = usernameJTextField.getText();
                userPass = userPassJTextField.getText();
                userFirstName = userFirstNameJTextField.getText();

                if (!checkValid(username) || !checkValid(userPass) || !checkValid(userFirstName)){
                    JOptionPane.showMessageDialog(null, "All fields must have values.");
                } else if (Userbase.getUserbase().userExist(username)==true){
                    JOptionPane.showMessageDialog(null, "Username is taken, please choose another.");
                } else {
                    Userbase.getUserbase().addUser(username, new User(username, userPass, userFirstName));
                    MathFactsGUI.setUsername(username);
                }
            }
        });

        JPanel mfSignUp = new JPanel()
        mfSignUp.setLayout(new GridLayout(0,1));
        mfSignUp.add(usernameBox);
        mfSignUp.add(userPassBox);
        mfSignUp.add(userFirstBox);
        mfSignUp.add(submitJButton);
    }

    public String signIn(){
        return username;
    }

    public boolean checkValid(String a){
        if (a == null || a.length() == 0){
            return false;
        } else {
            return true;
        }
    }
}```

I was thinking of implementing a WindowListener action for when the sign-up/sign-in frames close, but I’m not sure that will work. I was also looking into JDialog, but I’m not sure if it has the layout/text verification properties I need.

Advertisement

Answer

Use a JOptionPane. It will simplify your layout without the need for creating a separate JFrame and easily pass values back to wherever it was called from. You can then make it check for valid username when you click OK.

Try this site. It gives a good rundown with example images

Advertisement