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()
变量后,调用方法usnm
,pass
和acc
会返回{ {1}}。知道为什么会这样吗?
新守则:
NullPointerException
答案 0 :(得分:0)
我建议你不要使用实例变量,而是使用局部变量。 换句话说,以这种方式重写您的方法:
public void onClick(){
String usnm = txtField.getText();
String pass = passField.getText();
...
}
希望这会有所帮助。
P.S。看起来ACCESS_GRANTED
和ACCESS_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)
这里的设计实际上存在很多问题。首先,您尝试在场景中实际存在这些控件之前访问txtField
和passField
控件的值。
使用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);
}
}