当前位置: 首页 > 知识库问答 >
问题:

在Java和JavaFX中跨场景传输信息时不更新的信息

上官波鸿
2023-03-14

我有一个登录页面,我正在尝试获得一个用户的电子邮件,他们输入显示在下一个页面,这是他们的主页。这是代码:

            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() {

    }
}

似乎我的方法在仪表板控制器从来没有被调用,为什么?事先谢谢你的帮助。

共有1个答案

萧英光
2023-03-14

我更新了小段,使它只加载一个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();
 类似资料:
  • 场景信息       点击场景信息按钮,打开场景信息编辑栏。填写您想设置的信息。 点击设置封面按钮,将当前界面设置为场景封面 点击设置初始视角按钮,将当前视角设置为场景初始视角,进入场景后,将自动飞行到该视角。 点击变更,可以控制场景的LOGO,该功能需要套餐权益支持。 点击场景模式,即可选择场景私有和公开两种模式。 点击场景标签输入框,即可自定义场景标签。

  • 场景信息       点击“场景信息”按钮,弹出场景基本信息面板。

  • 对我如何做到这一点有什么建议吗? 这是我到目前为止编写的代码,但它似乎忽略了Thread.Sleep并且只使第三个代码变为蓝色。

  • 接口说明 查询场景JSON信息 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 GET /wish3dearth/api/scene/v1.0.0/getSceneJsonInfo 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 token string header 否 当前登录用户的TOKEN sceneId str

  • 接口说明 查询场景JSON信息 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 如开启https功能,请求地址的协议应改为https,如:https://www.example.com/wish3dearth/api/access/v1.0.0/getLicenseInfo API地址 GET /wish3dearth/api/scene/v1.0.0/