1

我有 Jframe,它有一个 JTextField 和一个 JButton。它应该将 Jtextfield 的文本返回到 anotherClass (MainPage)。但是当程序启动时,它会返回 null 给类。

    public class JframeFoo extends JFrame {

    private String username = new String();

    public JframeFoo() {
        // --------------------------------------------------------------
        // Making Frame for login

        final JTextField usernameFiled = new JTextField();
        this.add(usernameFiled);

        JButton signinButton = new JButton();
        // ------------------------------------------------------------

        signinButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {

                setVisible(false);
                Main.mainpage.setVisible(true);

            }
        });
        // ----------------------------------------------------------------------
        username = usernameFiled.getText();
    }

    public String getuserName() {
        return this.username;
    }
}

(这个 Jframe 应该在程序开始时运行,当它获取文本时,它应该变为不可见并且另一个类应该变为可见。)

4

3 回答 3

3

您需要将对 username = usernameField.getText() 的调用移动到 actionPerformed 方法中。它只会按照您当前拥有的方式设置为 null 。

于 2013-07-30T13:16:35.403 回答
3

JFrameFoo()创建该框架时调用构造函数。因此,这一行:

username = usernameFiled.getText();

在那个时候也被调用。你想要做的是:

signinButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent arg0) {            
        username = usernameFiled.getText();
        setVisible(false);
        Main.mainpage.setVisible(true);
    }
});

编辑

我期望也出错的是您userName在初始化之前在主类中使用它。我会推荐两件事:

  1. 了解事件驱动编程和回调。源代码中一行在另一行之下这一简单事实并不意味着它稍后会执行。
  2. 而不是打电话mainPage.setVisible,做类似的事情

signinButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent arg0) {            
        setVisible(false);
        Main.mainpage.open(usernameFiled.getText());
    }
});

并在您的主页中添加该方法,执行类似的操作

public void open(String username) {
    this.setVisible(true);
    // do whatever you want to do with username
}
于 2013-07-30T13:17:15.493 回答
2

除了getText()actionPerformed被覆盖的方法中调用方法之外,您还可以使用this.dispose();而不是setVisible(false);

所以你的代码看起来像:

        signinButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                username = usernameFiled.getText();
                if ((username != null) || !(username.length() == 0)) {
                    this.dispose();
                    Main.mainpage.setVisible(true);
                } else {
                    // Appropriate error here...
                }
            }
        });

getText()从内部调用actionPerformed还允许您在处理框架并继续之前对用户名变量进行一些检查(再次参见上面的片段)。

祝你好运!

于 2013-07-30T13:31:57.470 回答