JavaFX getText (), setText (), toString () дают нулевые указатели - PullRequest
0 голосов
/ 02 июня 2018

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

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ Проблема начинается здесь ▬▬100

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

Вызов методов getText(), setText() и toString() после объявления usnm, pass и acc переменные в Controller.java возвращают 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);
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 03 июня 2018

это потому, что когда init контроллера класса, это трей для инициализации переменной экземпляра init из другой переменной экземпляра, которая равна нулю.Мое предложение это переместить это

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

в метод, который срабатывает, когда кто-то заполняет эти поля, и позволяет создать переменную экземпляра null.

ex.

private String usnm 
private String pass
private String acc

Но:

я вижу, вы пытаетесь сделать это как MVC - я думаю, что вы делаете это неправильно - прочитайте что-нибудь об этом паттерне.

0 голосов
/ 03 июня 2018

На самом деле здесь довольно много проблем с вашим дизайном.Прежде всего, вы пытаетесь получить доступ к значениям элементов управления txtField и passField до того, как эти элементы управления фактически появятся в сцене.

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

}
0 голосов
/ 02 июня 2018

Я предлагаю вам не использовать переменные экземпляра, а локальную переменную.Другими словами, перепишите ваш метод следующим образом:

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

Надеюсь, это поможет.

PS Похоже, ACCESS_GRANTED и ACCESS_DENIED должны быть константами, поэтому добавьте для них статический идентификатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...