JavaFX getText()、setText()、toString() 提供空指针

JavaFX getText(), setText(), toString() give Null Pointers

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";

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

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

在 [=33] 中声明 usnmpassacc 变量后调用方法 getText()setText()toString() =] returns NullPointerException。知道为什么会这样吗?


新代码:

public class Controller {

    @FXML
    private TextField txtField;
    @FXML
    private PasswordField passField;
    @FXML
    private Button btn;
    @FXML
    private 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();

        if (usnm.equals(USNM)) {
            if (pass.equals(PASS)) {
                access.setText(ACCESS_GRANTED);
            } else {
                access.setText(ACCESS_DENIED);
            }
        } else {
            access.setText(ACCESS_DENIED);
        }
    }
}

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

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

希望这会有所帮助。

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

因为classcontroller init时,它是从另一个实例变量初始化实例变量的托盘,它是null。我的建议是移动这个

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

当有人填写这个字段时触发的方法,让创建实例变量 null。

例如

private String usnm 
private String pass
private String acc

但是:

我看到你尝试像 MVC 那样做 - 我认为你做错了 - 读一些关于这个模式的东西。

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

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

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

@FXML
private TextField txtField;

这基本上告诉 Java TextField 已经在关联的 FXML 文档中定义。

并且您需要在 单击 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);
    }

}