如何设置一个 JFrame 按钮以打开另一个 JFrame,然后在第二个 jframe 关闭后接收信息?

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

这是学校项目的一部分,我被困住了,需要有人来讨论我的想法。我有一个游戏,可以选择注册或登录机器本地游戏,以便记录该人的分数。该游戏是来自基本 GUI JFrame 的 运行,我想制作按钮以调出辅助 windows 供人们登录或注册,然后再关闭它们。我需要将经过验证的用户名传回初始的 GUI/game class 以便我可以将其存储在下一个游戏中,以便可以在该用户下添加游戏分数。我只需要传回用户名,但我不确定该怎么做。这是我遇到问题的主要 GUI 代码:

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);
        
        }
    });
}

这是我为注册按钮写的JFrame

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;
        }
    }
}```

我正在考虑在 sign-up/sign-in 帧关闭时执行 WindowListener 操作,但我不确定是否可行。我也在研究 JDialog,但我不确定它是否具有我需要的 layout/text 验证属性。

使用 JOptionPane。它将简化您的布局,而无需创建单独的 JFrame,并且可以轻松地将值传回调用它的任何地方。然后,您可以在单击“确定”时让它检查用户名是否有效。

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

首先您需要了解这是一个对象,因此您可以创建一些包含此信息(用户名、密码、昵称)的全局变量,我建议使用 ScheduledExecutorService 从 MathFactsSignUpGUI 中提取信息。它会每 100 毫秒从这个注册 gui 中提取信息,然后它会自行销毁,这是一个例子:

MathFactsSignUpGUI su = new MathFactsSignUpGUI ();
        su.setVisible(true);
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        service.schedule(new Runnable(){
            public void run(){
                if(!su.username.isEmpty() && !su.userPass.isEmpty() && !su.userFirstName.isEmpty() ){
                    if(su.isLogin){ //if player is loggining
                        //do something here
                    }else{//if user is registered
                        //do something here
                    }
                    System.out.println("Check complete");
                    service.shutdown();//to destroy this service after recieving the data
                }
            }
        }, 100, TimeUnit.MICROSECONDS);