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?
Passagem de dados para outra tela JavaFX
4 Respostas
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