Как я могу получить ссылку на контроллер F XML? - PullRequest
1 голос
/ 30 апреля 2020

Я пытаюсь создать небольшую форму «Войти, затем главное меню», используя JavaFX и Scene Builder от Gluon. До сих пор я сделал 2 сцены, первая из них - экран «Вход», в котором я подключил базу данных SQLite, после ввода правильного имени пользователя и пароля она прекрасно загружается и переходит на вторую сцену. Для каждой сцены я использую свой класс (F XML / F XML Controller). Во второй сцене я хочу 2 метки, которые я использую для изменения в соответствии с данными базы данных (более конкретно First_Name и Role). Это код, который я использую, когда я нажимаю кнопку «ОК» в первой сцене, и он загружает базу данных:

public class FXMLDocumentController implements Initializable {
    public static Connection con;
    public static ResultSet rs;
    public static String Name;
    public static String Role;

    @FXML
    private void OKButtonAction(ActionEvent event) throws SQLException, IOException {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("MainMenuFXML.fxml"));
        MainMenuFXMLController mainmenu = loader.getController();
        try {
            PreparedStatement pst ;
            // db parameters
            String DBlink = "jdbc:sqlite:"+System.getProperty("user.dir")+"//MedExpressDB.db";
            // create a connection to the database
            con = DriverManager.getConnection(DBlink);            
            String sql = "SELECT ID,UserName,Password,First_Name,Last_Name,Role,Address,Town,Phone,AFM,AMKA,Email FROM Users where (UserName = ? and Password = ?)";
            pst = con.prepareStatement(sql);
            pst.setString(1, user.getText());
            pst.setString(2, pass.getText());
            rs = pst.executeQuery();
            if (rs.next() == false){
                System.out.println("Λάθος κωδικός ή Username!");
            }else{
                Name = "WElcome, "+rs.getString("First_Name");
                Role = rs.getString("Role");
                mainmenu.setLabels(Name, Role);
                Parent root = FXMLLoader.load(getClass().getResource("MainMenuFXML.fxml"));
                Scene scene2 = new Scene(root);
                Stage stage = (Stage) okbutton.getScene().getWindow();
                stage.setScene(scene2);
                System.out.println("\nConnection has been established!\nWelcome!");

            } 
        }
         catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }  
    }
}

А во втором классе, где я использую вторую сцену, у меня есть:

public class MainMenuFXMLController implements Initializable {

    @FXML
    private Label welcomelbl;

    @FXML
    private Label rolelbl;

    public void setLabels(String name, String role){
        welcomelbl.setText(name);
        rolelbl.setText(role);
    }
}

//I tried the:
public void setLabels(x,y){
   welcomelbl.setText(x);
   rolelbl.setText(y);
}
//and use setLabels in the 1st Class:
                FXMLLoader loader = new FXMLLoader(getClass().getResource("MainMenuFXML.fxml"));
                MainMenuFXMLController mainmenu = loader.getController();
                Name = "Welcome, "+rs.getString("First_Name");
                Role = rs.getString("Role");
                mainmenu.setLabels(Name, Role);

, как вы можете видеть, но выдает ошибку java .lang.reflect.InvocationTargetException.

1 Ответ

2 голосов
/ 30 апреля 2020

При загрузке 2-й сцены получите ссылку на контроллер и используйте ее:

FXMLLoader loader = new FXMLLoader(getClass().getResource("MainMenuFXML.fxml")); //once only, not twice as posted ! 
Parent root = loader.load();  //this is essential 
MainMenuFXMLController mainmenu = loader.getController();
mainmenu.setLabels(Name, Role);
...