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] 中声明 usnm
、pass
和 acc
变量后调用方法 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_GRANTED
和 ACCESS_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 那样做 - 我认为你做错了 - 读一些关于这个模式的东西。
您的设计实际上存在很多问题。首先,您试图在 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);
}
}
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] 中声明 usnm
、pass
和 acc
变量后调用方法 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_GRANTED
和 ACCESS_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 那样做 - 我认为你做错了 - 读一些关于这个模式的东西。
您的设计实际上存在很多问题。首先,您试图在 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);
}
}