在 Java 和 JavaFX 中跨场景传输信息时信息未更新
Information not being updated when transferring information across scenes in Java and JavaFX
我有一个登录页面,我正在尝试让他们输入的用户电子邮件显示在下一页(即他们的主页)上。这是代码:
FXMLLoader loaderNew = new FXMLLoader(getClass().getResource("/sample/view/Dashboard.fxml"));
try {
loaderNew.load();
} catch (IOException e) {
e.printStackTrace();
}
DashboardController dashboardController = loaderNew.getController();
dashboardController.setName(loginEmail.getText().trim());
这是我要调用的方法:
public void setName(String name){
nameLbl.setText(name);
}
我没有收到任何错误,只是没有更新 nameLbl,我不知道为什么。 logincontroller 将成功进入仪表板,只是不会更新 nameLbl。
这里有两个完整的代码。
登录控制器:
package sample.controller;
import java.io.IOException;
import java.net.URL;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import sample.database.DBConnection;
import sample.model.User;
public class LoginController {
@FXML
private ResourceBundle resources;
@FXML
private URL location;
@FXML
private Button loginButton;
@FXML
private TextField loginEmail;
@FXML
private Button createAccountSwitchButton;
@FXML
private Label errorLabel;
@FXML
private PasswordField loginPassword;
private DBConnection dbConnection;
@FXML
void initialize() {
dbConnection = new DBConnection();
loginButton.setOnAction(event-> {
String loginEmailText = loginEmail.getText().trim();
String loginPasswordText = loginPassword.getText().trim();
User user = new User();
user.setEmail(loginEmailText);
user.setPassword(loginPasswordText);
ResultSet userRow = dbConnection.checkForUser(user);
int counter = 0;
try{
while (userRow.next()){
counter++;
}
if (counter==1){
//-------------------Below this line to the next line seems to do nothing-------------------------------------------------------------------
FXMLLoader loaderNew = new FXMLLoader(getClass().getResource("/sample/view/Dashboard.fxml"));
try {
loaderNew.load();
} catch (IOException e) {
e.printStackTrace();
}
DashboardController dashboardController = loaderNew.getController();
dashboardController.setName(loginEmail.getText().trim());
//---------------------------------------------------------------------------------------
loginButton.getScene().getWindow().hide();
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/sample/view/Dashboard.fxml"));
try {
loader.load();
} catch (IOException e) {
e.printStackTrace();
}
Parent root = loader.getRoot();
Stage stage = new Stage();
stage.setScene(new Scene(root));
stage.showAndWait();
}else{
errorLabel.setText("Email or Password Incorrect");
}
}catch(SQLException e){
e.printStackTrace();
}
});
}
}
仪表板控制器:
package sample.controller;
//imports here same as above
public class DashboardController {
@FXML
private Label nameLbl;
public void setName(String name){
nameLbl.setText(name);
}
@FXML
void initialize() {
}
}
似乎我在 Dashboard 控制器中的方法从未被调用,这是为什么?在此先感谢您的帮助。
我更新了这个小片段,它只加载了一个 FXML 加载器,现在可以正常工作了。
loginButton.getScene().getWindow().hide();
FXMLLoader loader = new FXMLLoader(getClass().getResource("/sample/view/Dashboard.fxml"));
try {
loader.load();
} catch (IOException e) {
e.printStackTrace();
}
Parent root = loader.getRoot();
DashboardController dashboardController = loader.getController();
dashboardController.setName(loginEmail.getText().trim());
Stage stage = new Stage();
stage.setScene(new Scene(root));
stage.show();
我有一个登录页面,我正在尝试让他们输入的用户电子邮件显示在下一页(即他们的主页)上。这是代码:
FXMLLoader loaderNew = new FXMLLoader(getClass().getResource("/sample/view/Dashboard.fxml"));
try {
loaderNew.load();
} catch (IOException e) {
e.printStackTrace();
}
DashboardController dashboardController = loaderNew.getController();
dashboardController.setName(loginEmail.getText().trim());
这是我要调用的方法:
public void setName(String name){
nameLbl.setText(name);
}
我没有收到任何错误,只是没有更新 nameLbl,我不知道为什么。 logincontroller 将成功进入仪表板,只是不会更新 nameLbl。
这里有两个完整的代码。
登录控制器:
package sample.controller;
import java.io.IOException;
import java.net.URL;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import sample.database.DBConnection;
import sample.model.User;
public class LoginController {
@FXML
private ResourceBundle resources;
@FXML
private URL location;
@FXML
private Button loginButton;
@FXML
private TextField loginEmail;
@FXML
private Button createAccountSwitchButton;
@FXML
private Label errorLabel;
@FXML
private PasswordField loginPassword;
private DBConnection dbConnection;
@FXML
void initialize() {
dbConnection = new DBConnection();
loginButton.setOnAction(event-> {
String loginEmailText = loginEmail.getText().trim();
String loginPasswordText = loginPassword.getText().trim();
User user = new User();
user.setEmail(loginEmailText);
user.setPassword(loginPasswordText);
ResultSet userRow = dbConnection.checkForUser(user);
int counter = 0;
try{
while (userRow.next()){
counter++;
}
if (counter==1){
//-------------------Below this line to the next line seems to do nothing-------------------------------------------------------------------
FXMLLoader loaderNew = new FXMLLoader(getClass().getResource("/sample/view/Dashboard.fxml"));
try {
loaderNew.load();
} catch (IOException e) {
e.printStackTrace();
}
DashboardController dashboardController = loaderNew.getController();
dashboardController.setName(loginEmail.getText().trim());
//---------------------------------------------------------------------------------------
loginButton.getScene().getWindow().hide();
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/sample/view/Dashboard.fxml"));
try {
loader.load();
} catch (IOException e) {
e.printStackTrace();
}
Parent root = loader.getRoot();
Stage stage = new Stage();
stage.setScene(new Scene(root));
stage.showAndWait();
}else{
errorLabel.setText("Email or Password Incorrect");
}
}catch(SQLException e){
e.printStackTrace();
}
});
}
}
仪表板控制器:
package sample.controller;
//imports here same as above
public class DashboardController {
@FXML
private Label nameLbl;
public void setName(String name){
nameLbl.setText(name);
}
@FXML
void initialize() {
}
}
似乎我在 Dashboard 控制器中的方法从未被调用,这是为什么?在此先感谢您的帮助。
我更新了这个小片段,它只加载了一个 FXML 加载器,现在可以正常工作了。
loginButton.getScene().getWindow().hide();
FXMLLoader loader = new FXMLLoader(getClass().getResource("/sample/view/Dashboard.fxml"));
try {
loader.load();
} catch (IOException e) {
e.printStackTrace();
}
Parent root = loader.getRoot();
DashboardController dashboardController = loader.getController();
dashboardController.setName(loginEmail.getText().trim());
Stage stage = new Stage();
stage.setScene(new Scene(root));
stage.show();