无法绑定:field是static:form.MainForm.nameTextField

时间:2014-03-22 22:34:32

标签: java swing static stack-overflow

当我创建静态方法并在另一个类中调用它时,我收到错误:

public static JTextField getNameTxtField(){
    return nameTxtField;
}
public static JTextField getNewUserNameTxtField(){
    return newUserNameTxtField;
}
public static JPasswordField getNewPasswordTextField(){
    return newPasswordTxtField;
}

所有上述getter都位于MainForm类中,并在此类中调用:

GameLogic

public void addToDatabase() throws SQLException {
    controller.addUserToDatabase(MainForm.getNameTxtField().getText(),MainForm.getNewUserNameTxtField().getText(), String.valueOf(MainForm.getNewPasswordTextField()) , "insert into application_user values(?, ?, ?)");
}

为什么我收到消息?我真的不明白这个消息,有人可以向我解释一下吗?

我无法在课程MainForm form = new MainForm();中创建这样的对象:GameLogic,因为我会得到StackOverflowError

问题是否发生是因为我用非静态方法调用静态getter?

2 个答案:

答案 0 :(得分:3)

忘记static。我假设你要做的是将一个实例变量从一个类引用到另一个类。您的尝试是使用static个变量。你正在尝试使用stackoverflow,因为你正在尝试这样的事情

public class MainForm ... {
    public MainForm() {
        GameForm game = new GameForm();
    }
}
public class GameForm ... {
    public GameForm() {
        MainForm main = new MainForm();
    }
}

这肯定会给你一个stackoverflow,因为你创建了一个创建GameForm的{​​{1}},它创建了一个MainForm,创建了一个GameForm,创建了一个MainForm GameForm 1}},它创建一个MainForm(得到点?),它创建一个stackoverflow。

解决方案是通过引用将MainForm传递给GameForm,并在getter中使用settersMainForm。像

这样的东西
public class MainForm ... {
    private JTextField field;
    private GameForm game;

    public MainForm() {
        game = new GameForm(MainForm.this);
    }

    public JTextField getField (){
        return field;
    }
}

public class GameField ... {
    private MainForm main;
    private JTextField field;

    public GameForm(final MainForm main) {
        this.main = main;
        this.field = main.getField();
    }
}

现在,在GameForm中,您引用了同一个实例JTextField


更好的,可能更合适的解决方案是使用interface并让MainForm实现它。您可以查看this answer作为示例。

答案 1 :(得分:0)

getText()(在addToUserDatabase()中调用)是一个非静态函数。您无法从静态上下文中引用非静态内容。