JavaFX - Tela de login e fechar o Stage

Olá
Tenho uma aplicação em JavaFX que tem a tela de login e deve direcionar para a tela principal. Porém, quando valido o Login, a tela do login PERMANECE.

Tudo funciona corretamente, mas isso não. Como “fechar” o Stage sem fechar toda a aplicação?
Observação: já tentei usar o stage.close(); e o stage.hide();
Não funcionou.

Atualmente, estava tentando criar um Stage separado, por isso minha classe ficou estranha. Segue a classe


public class Main extends Application {
	Stage meuStage = new Stage(); // stage que chama o login
	Stage meuStage2 = new Stage(); // stage que chama a tela principal

	Constante c = new Constante();
	DialogFX dialog = new DialogFX(); // criei isso, ignore.
	boolean verificador = false;
	@FXML TextField txtUsuario; // está vindo de um FXML
	@FXML PasswordField txtSenha; // está vindo de um FXML

	public void criarTela() { // Chama a tela de login
		try {
			Pane root = FXMLLoader.load(getClass().getResource("/view/Form_Login.fxml"));
			Scene scene = new Scene(root);
			meuStage.setTitle("Login");
			meuStage.setScene(scene);
			meuStage.show();
			
		} catch(Exception e) {
			JOptionPane.showMessageDialog(null, "Erro\n"+e.getMessage());
			
		}
		
	}
	
	@FXML
	public boolean login() { // Verifica o login
		int cont = 0;
		try {
			Class.forName(c.DRIVER);
			Connection conn = DriverManager.getConnection(c.URL, c.USER, c.PASSWORD);
			Statement stm = conn.createStatement();
			
			ResultSet result = stm.executeQuery("SELECT COUNT(*) AS cont FROM B001 WHERE "
					+ "B001_USUARIO='"+txtUsuario.getText()+"' AND B001_SENHA=md5('"+txtSenha.getText()+"'); ");
			
			while(result.next()) {
				cont = result.getInt("cont");
				
			}
			
			if(cont == 1) {
                                // deve fechar o meuStage e abrir o meuStage2
				verificador = true ;
				meuStage.close(); // não vai

				Pane root = FXMLLoader.load(getClass().getResource("/view/Form_Principal.fxml"));
				Scene scene = new Scene(root);
				meuStage2.setMinHeight(500);
				meuStage2.setMinWidth(800);
				meuStage2.setScene(scene);
				meuStage2.show();

			} else if(cont > 1) {
				verificador = false ;
				dialog.showDialog("error", "Falha no login", "Registro duplicado", "Por favor, entre em contato com o suporte");
				
			} else if(cont <= 0) {
				verificador = false ;
				dialog.showDialog("error", "Falha no login", "Registro não encontrado", "Verifique suas credenciais!");
				
			}
			
		} catch (ClassNotFoundException e) {
			dialog.showDialog("error", "ClassNotFoundException", "Verifique o driver da conexão", e.getMessage());
			
		} catch (SQLException e) {
			dialog.showDialog("error", "SQLException", "Verifique a query da conexão", e.getMessage());

		} catch (Exception e) {
			dialog.showDialog("error", "Exception", "Entre em contato com o suporte", e.getMessage());

		}

		return verificador;

	}

	@Override
	public void start(Stage primaryStage) throws Exception {
		Main main = new Main();
		main.criarTela();
		
	}

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

Olá, tenho um exemplo de login no meu Git, também uma lib para criação de janelas, dê uma olhada, vai ajudar:


Mas resumindo, você precisa da instância do stage do login dentro do controller do login. Isso pode ser obtido por qualquer componente da tela ex:

botão.getScene().getWindow();

Faça um cast pra stage e chame o método close.

Da forma que está fazendo (me parece) que não tem um controller para o login, e dessa forma fica meio difícil.

Na verdade, esta classe é a própria controller. Sim, é errado. Sim, eu fiz outra classe pra controller do login, só deixei em off no momento. Queria ver se ficava mais fácil usando a mesma classe pra fazer tudo. Me parece que não…

Então voltarei à configuração anterior

Vou dar uma olhada na sua lib e vou testar isso. Obrigado

Só uma dúvida, sua ideia é que o login sobreponha a principal ou que seja mostrado somente o login depois a principal?

Vamos lá
É um login normal. Segue o “normal”:

  1. Executo o sistema e aparece a tela de login
  2. Digito usuario e senha (digamos que digito correto, descarte as outras possibilidades)
  3. A tela de LOGIN “some” (fica oculta, sei lá)
  4. A tela PRINCIPAL (a que tem o menu, cadastros, etc) é exibida e permanece até a finalização

O que ocorre é que a tela de login fica atrás da tela principal. Entao posso chamá-la a qualquer momento. Sim, eu posso desabilitá-la, posso remover os componentes do BorderPane, mas quero mesmo é que a tela de LOGIN “suma” após direcionar para a tela principal.

Certo, você pode fazer assim:
Na sua classe application vc recebe o primaryStage esse deve ser seu frame principal, deixe - o oculto não invoque o método show, crie outro stage com o login e recupere o controller pelo método fxmlloader.getController() passe o stage principal para o login para mostrar quando necessário, depois do login só chame close do stage login e show do principal.
Esse processo é meio chatinho de fazer, por isso criei a lib.
Não tô podendo postar código, pois estou no celular. Qqr coisa de uma olhada no projeto AwesomeUi (que não usa a lib) pra clarear as ideias.

Cara, voce ajudou um amigo meu que estava com o mesmo problema. Ele me passou sua lib e fiz testes aqui

Graças a isso, tô conseguindo fazer o que eu queria.

Valeu mesmo :’)

Manda pra mim aí brown. Estou com o mesmo problema. Kkkk

Resolvido!
Consegui com getters e setters.
Baseado nessa idéia.

1 curtida

Cara, desculpa não ter respondido antes, eu realmente não vi o GUJ esses dias, ficou corrido o fim de ano aqui

Eu tinha resolvido, na época, usando essa lib https://github.com/Andrauss/WindowControllerFx
Mas eu já não estou mais usando Java a não ser para Android. Muito menos JavaFX

[ TOPICO RESOLVIDO ]
Para quem ver este tópico nas gerações futuras… Eu resolvi, como eu disse acima, usando essa lib aí

É bem interessante e facilita bastante coisa.
Valeu!

Olá sei q esse tópico já faz um tempo mas to com um sério problema relacionado a isso, tenho uma tela de pesquisa que é preciso abrir a quase todo momento e com um certo tempo ela fica aberta por traz da tela principal mesmo estando como application_modal não sei se tem que colocar como window_modal ja testei stage.close() e .hide() e nada, mas parece que fica como oculto, se alguem puder ajudar desde já agradeço