Criar eventos em geral

Amigos…

Tenham certeza de que só venho pedir a ajuda de vocês, depois de tentar de tudo.

Como sei que a demanda é grande, aqui, não gosto de colaborar com a poluição do fórum, por preguiça.

Dessa forma, vamos lá:

Sou novo em Java e estou trabalhando com JavaFX + netbeans + Scene builder.

Preciso saber como criar eventos, além daqueles que já existem prontos, no scene builder.

Eventos do tipo: AO PERDER O FOCO, AO FECHAR A JANELA, AO GANHAR FOCO, etc.

Pesquisei, aqui, no fórum, e não encontrei a solução, em nenhum, post.

Também li a documentação da oracle, sobre isso, de cabo a rabo. Porém, apesar de estar bem explicado lá, eles não deixam claro sobre ONDE colocar os códigos: seria no método INICIALIZE? Seria em um método à parte?).

O fato é que tentei de todas as formas e nada funcionou (EVENT HANDLER, EVENT FILTER, no método inicialize, em métodos à parte…)

Especificamente, estou tentando fazer um evento AO FECHAR. Nesse caso, quando a janela for fechada, preciso executar certo método. Independentemente de a janela ser fechada através do botão “X”, através de alt+F4, etc.

Se alguém tiver uma “receita” para isso, agradeço, MUITO.

Pelo que você disse, você não quer criar um evento, você quer tratar um evento.

Adiciona um WindowListener e trata o evento windowClosing.

@staroski, obrigado pela dica.

Porém não sei fazer isso. Assim como falei, sou novo na linguagem.

Até vi alguns exemplos com Listener, mas, assim como os EventHandler, não sei onde colocá-los.

Se você conseguir me dar um exemplo com detalhes e me informando ONDE colocar cada parte do código, irá me ajudar, MUITO.

De toda forma, agradeço, novamente. Sua dica já começou a me redirecionar.

Uma última dúvida: os Listener funcionam com o JavaFX?

Opa, amigos!

Depois de MUITA luta, achei a solução.

Eu queria, especificamente, que um método fosse executado, quando uma janeja específica fosse fechada. Eu estava com dúvidas sobre ONDE eu deveria colocar esse código, ou seja, em que parte do código.

O código para que o evento seja instalado é a seguinte expressão lambda:

janelaClientes.addEventHandler(WindowEvent.WINDOW_CLOSE_REQUEST, (WindowEvent w) -> {
System.out.println(“SAÍÍÍÍ!!!”);
});

E ela deve ser colocada dentro do método de chamada da janela, logo após a criação do Stage, e antes do comando “janela.Show()”.

Aqui, com o JavaFX, funcionou, perfeitamente.

Segue, abaixo, o método de chamada da janela, completo, com a expressão lambda no lugar onde deve estar:

public void AbreJanelaCadastro() {
    try
    {
        Inicio.getJanelaLogin().close();
            
        Stage janelaClientes = new Stage();
        janelaClientes.setTitle ("Cadastro de Clientes");

        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Telas/frmCadCli.fxml"));
        Parent parent = (Parent)fxmlLoader.load();

        FrmCadCliController telacontroller = fxmlLoader.getController();

        Scene scene = new Scene(parent); 
        janelaClientes.setScene(scene);
        
        //Evento "AO SAIR" para o formulário
        janelaClientes.addEventHandler(WindowEvent.WINDOW_CLOSE_REQUEST, (WindowEvent w) -> {
            System.out.println("SAÍÍÍÍ!!!!!");
        });
 
        janelaClientes.show();
    }
    catch (Exception exc)
    {
        exc.printStackTrace();
        Alert alerta = new Alert(Alert.AlertType.ERROR);
        alerta.setContentText("EXCEÇÃO! (AbreJanelaCadastro)");
        alerta.setHeaderText(exc.getMessage());
        alerta.setTitle("OPAAAA!!!");
        alerta.show();
    }

}