JavaFX getText(),setText(),toString()给出Null指针

时间:2018-06-02 20:23:25

标签: java javafx javafx-8 fxml

Controller.java

import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;

public class Controller {

    public TextField txtField;
    public PasswordField passField;
    public Button btn;
    public Label access;

    private String USNM = "crimsoncoder";
    private String PASS = "toor";

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬问题从这里开始▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

    private String usnm = txtField.getText();
    private String pass = passField.getText();
    private String acc = access.getText();

    private final String ACCESS_GRANTED = "/ACCESS_GRANTED/";
    private final String ACCESS_DENIED = "|/?ACCESS_DENIED?/|";

    public void onClick() {
        if (usnm.equals(USNM)) {
            if (pass.equals(PASS)) {
                acc = ACCESS_GRANTED;
            } else {
                acc = ACCESS_DENIED;
            }
        } else {
            acc = ACCESS_DENIED;
        }
    }
}

在Controller.java中声明getText()setText()toString()变量后,调用方法usnmpassacc会返回{ {1}}。知道为什么会这样吗?

新守则:

NullPointerException

3 个答案:

答案 0 :(得分:0)

我建议你不要使用实例变量,而是使用局部变量。 换句话说,以这种方式重写您的方法:

public void onClick(){
        String usnm = txtField.getText();
        String pass = passField.getText();
        ...
}

希望这会有所帮助。

P.S。看起来ACCESS_GRANTEDACCESS_DENIED应该是常量,因此请为它们添加静态标识符。

答案 1 :(得分:0)

这是因为当类控制器初始化时,它是来自另一个实例变量的init实例变量的托盘,它是null。我的主张是移动这个

private String usnm = txtField.getText();
private String pass = passField.getText();
private String acc = access.getText();

到某人填充此字段时触发的方法,并让create instance变量为null。

离。

private String usnm 
private String pass
private String acc

可是:

我看到你尝试像MVC那样做 - 我认为你做错了 - 阅读一些关于这种模式的内容。

答案 2 :(得分:0)

这里的设计实际上存在很多问题。首先,您尝试在场景中实际存在这些控件之前访问txtFieldpassField控件的值。

使用JavaFX和FXML,在场景初始化之前,这些控件不会构建(或注入)并可供控制器使用。

控件引用也应该是private并使用@FXML关键字注释,如下所示:

@FXML
private TextField txtField;

这实质上告诉Java已经在关联的FXML文档中定义了TextField

在单击LOGIN按钮后,您需要获取用户名和密码字段的值,因此请更新您的onClick()方法以检索该值的值时间:

public void onClick() {

        String usnm = txtField.getText();
        String pass = passField.getText();

        String acc;

        if (usnm.equals(USNM)) {
            if (pass.equals(PASS)) {
                acc = ACCESS_GRANTED;
            } else {
                acc = ACCESS_DENIED;
            }
        } else {
            acc = ACCESS_DENIED;
        }

        System.out.println(acc);
    }

因此,对于稍微好一点的Controller.java,您可以使用以下内容:

public class Controller {

    @FXML
    public TextField txtField;
    @FXML
    public PasswordField passField;
    @FXML
    public Button btn;
    @FXML
    public Label access;

    private String USNM = "crimsoncoder";
    private String PASS = "toor";

    private static final String ACCESS_GRANTED = "/ACCESS_GRANTED/";
    private static final String ACCESS_DENIED = "|/?ACCESS_DENIED?/|";

    public void onClick() {

        String usnm = txtField.getText();
        String pass = passField.getText();

        String acc;

        if (usnm.equals(USNM)) {
            if (pass.equals(PASS)) {
                acc = ACCESS_GRANTED;
            } else {
                acc = ACCESS_DENIED;
            }
        } else {
            acc = ACCESS_DENIED;
        }

        System.out.println(acc);
    }

}