Passagem de dados para outra tela JavaFX

Olá pessoal, boa tarde. Estou fazendo um sistema em JavaFX com banco de dados MySQL, estou com uma dúvida tremenda que não consigo resolver. Bom, eu preciso que quando o usuário logue no sistema armazene em uma variável o “tipo de conta” dele: Administrador, Paciente, etc. Armazenando esses dados eu quero que passe para a outra tela para poder limitar o usuário em que telas ele pode usar. No swing eu poderia criar um construtor e passar por parâmetro um nome e setar em um jTextField, mas no javafx eu utilizo o método initialize para iniciar os métodos de controller da tela. Como eu poderia passar dados de uma tela para outra em JavaFx?

Faz muito tempo que eu não mexo com JavaFX, mas era assim que eu fazia


	@FXML public void seuMetodo() throws IOException
	{
		FXMLLoader loader = new FXMLLoader();
		loader.setLocation(getClass().getResource("/arquivo.fxml"));
		Parent root = loader.load();
		SeuController controller = loader.getController();
		controller.setAtributo(parametro);
		
		Stage stage = new Stage();
		Scene scene = new Scene(root);
		stage.setScene(scene);
		stage.show();
	}

Olá Myke, não entendi muito bem seu código. Poderia me explicar melhor? Estou utilizando uma classe “principal” para cada tela FXML, segue exemplo: http://prntscr.com/jdgb34 e para cada classe “principal” eu tenho um controller.

Classe “principal” Login:


import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.stage.StageStyle;


public class Login extends Application {

    private static Stage stage;
    private double x;
    private double y;

    @Override
    public void start(Stage stage) throws Exception {

        Parent root = FXMLLoader.load(getClass().getResource("/view/ViewLogin.fxml"));
        stage.initStyle(StageStyle.UNDECORATED);
        stage.setScene(new Scene(root));
        stage.setTitle("Login");
        stage.show();
        setStage(stage);

        /*
          Ao pressionar a tela ->
          Guarda a posição atual X
          Guarda a posição atual Y
         */
        root.setOnMousePressed((event -> {
            x = event.getSceneX();
            y = event.getSceneY();
        }));

        /*
          Ao arrastar a tela ->
          Pega a posição atual X menos a posição armazenada X
          Pega a posição atual Y menos a posição armazenada Y
          Seta na tela a posição X e Y
         */
        root.setOnMouseDragged((event -> {
            stage.setX(event.getScreenX() - x);
            stage.setY(event.getScreenY() - y);
        }));
    }

    //Pega a stage(Janela) atual
    public static Stage getStage() {
        return stage;
    }

    /**
     * Seta a stage atual ->
     * Abrir ou Fechar
     */
    public static void setStage(Stage stage) {
        Login.stage = stage;
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Controller do Login:

package primary.controller;

import com.jfoenix.controls.JFXTextField;
import javafx.concurrent.Task;
import primary.model.ModelLogin;
import primary.sample.Login;
import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXCheckBox;
import primary.conexao.ConexaoMySql;
import de.jensd.fx.glyphs.fontawesome.FontAwesomeIcon;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;
import primary.sample.Principal;

import java.io.IOException;
import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
import java.sql.SQLException;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.prefs.Preferences;

public class ControllerLogin implements Initializable {

    @FXML
    private JFXButton btnEntrar;
    @FXML
    public TextField txtAcesso;
    @FXML
    private PasswordField txtSenha;
    @FXML
    private FontAwesomeIcon close;
    @FXML
    private FontAwesomeIcon minimizar;
    @FXML
    private Label lblBanco;
    @FXML
    private ImageView imgBanco;
    @FXML
    private JFXCheckBox rememberMe;

    Preferences preferences;

    private ConexaoMySql conn = new ConexaoMySql();
    private Image bancoOn = new Image(String.valueOf(getClass().getResource("/imagens/icons8-aceitar-banco-de-dados-20.jpg")));
    private Image bancoOff = new Image(String.valueOf(getClass().getResource("/imagens/icons8-excluir-banco-de-dados-20.jpg")));

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        conn.getConnection();
        preferences = Preferences.userNodeForPackage(ControllerLogin.class);
        if (preferences != null) {
            if (preferences.get("txtAcesso", null) != null && !preferences.get("txtSenha", null).isEmpty()) {
                txtAcesso.setText(preferences.get("txtAcesso", null));
                txtSenha.setText(preferences.get("txtSenha", null));
            }
        }
        /*
          Verifica se o banco está conectado ->
          Se estiver conectado: seta uma mensagem que está conectado e uma imagem;
          Se estiver offline: seta uma mensagem que está offline e uma imagem;
         */
        if (conn.conn != null) {
            lblBanco.setText("Conexão estabelecida");
            imgBanco.setImage(bancoOn);
        } else {
            lblBanco.setText("Conexão não estabelecida");
            imgBanco.setImage(bancoOff);
        }
        //Método para clicar no botão e entrar no sistema
        btnEntrar.setOnMouseClicked((MouseEvent e) -> {
            if (conn.conn == null) {
                Alert alert = new Alert(Alert.AlertType.WARNING);
                alert.setTitle("WARNING");
                alert.setHeaderText("Banco de dados offline");
                alert.setContentText("Opa! Parece que o banco de dados está offline!");
                alert.show();
            }
            /*
              Instância das classes -> Conexão e a Janela principal
             */
            Principal viewPrincipal = new Principal();
            try {
                //Verifica se o que o usuário digitou está contido no banco de dados
                conn.executeSql("SELECT * FROM tbl_usuarios where cod_acesso='" + txtAcesso.getText() + "'");
                conn.resultSet.first();
                //Se o que o usuário digitou tiver no banco, verifica se a senha que o usuário digitou é válida
                if (conn.resultSet.getString("senha").equals(txtSenha.getText())) {
                    if (rememberMe.isSelected()) {
                        preferences.put("txtAcesso", txtAcesso.getText());
                        preferences.put("txtSenha", txtSenha.getText());
                        rememberMe.checkedColorProperty();
                    } else {
                        preferences.put("txtAcesso", "");
                        preferences.put("txtSenha", "");
                    }
                    /*
                      Se a senha estiver válida, a janela atual é fechada
                     */

                    Login.getStage().close();
                    try {
                        /*
                          Abre a janela principal mostrando um alerta dizendo que o login foi efetuado
                         */
                        viewPrincipal.start(new Stage());
                        Alert alert = new Alert(Alert.AlertType.INFORMATION);
                        alert.setTitle("Information");
                        alert.setHeaderText("Login Efetuado");
                        alert.setContentText("Seja bem-vindo, login efetuado com sucesso!");
                        alert.show();
                        conn.closeConnection();
                    } catch (Exception ex) {
                        Logger.getLogger(ControllerLogin.class.getName()).log(Level.SEVERE, null, ex);
                    }
                } else {
                    AlertError();
                }
                //Se o usuário não estiver presente no banco de dados -> Mensagem de erro
            } catch (SQLException e1) {
                AlertError();
            }
        });

        //Fecha a janela e encerra o sistema
        close.setOnMouseClicked((MouseEvent event) -> System.exit(0));

        //Minimiza a janela
        minimizar.setOnMouseClicked((MouseEvent e) -> Login.getStage().setIconified(true));
    }

    private void AlertError() {
        Alert alert = new Alert(Alert.AlertType.ERROR);
        alert.setTitle("Error");
        alert.setHeaderText("Usuário/Senha inválidos");
        alert.setContentText("Usuário ou senha inválidos!");
        alert.show();
    }

}

Eu gostaria de pegar o que o usuário digitar no txtAcesso e passar para a outra tela. Estou utilizando o padrão MVC. Não consegui entender muito bem o seu código, se puder me ajudar irei te agradecer bastante!

O Mike postou a parte do codigo que resolve seu problema.
Toda vez que voce for chamar uma nova FXML e voce precisa passar parametros, basta criar um metodo dentro do controller que receba esses parametros.

Olha o codigo com calma e nele está a solução.

Como não entendeu? Haha
A única coisa diferente é isso:

SeuController controller = loader.getController();
controller.setAtributo(parametro);

O restante para abrir uma nova janela é igual…
Você tentou fazer?

Se não estiver dando certo, cria um projeto basicão só para tentar