Passagem de dados para outra tela JavaFX

4 respostas
programaçãojavamysql
L

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?

4 Respostas

M

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();
	}
L

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!

J

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.

M

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

Criado 3 de maio de 2018
Ultima resposta 4 de mai. de 2018
Respostas 4
Participantes 3