Desbloquear botões ao fechar jInternalFrame

Quando abro um JInternalFrame os botões devem ser desabilitados, ao fechar a aba, os botões devem ficar ativados. O problema é que não estou conseguindo ativar os botões quando fecho a aba.

Quando ativo um botão os outros ficam desativados corretamente.

Quando fecho o JInternalFrame eu gostaria que os botões ficassem ativos.

Action do botão do paciente

  private void btnPacienteActionPerformed(java.awt.event.ActionEvent evt) {                                            
        // TODO add your handling code here:

        TelaPaciente telapaciente = new TelaPaciente();
        jDesktopPane1.add(telapaciente);
        telapaciente.setVisible(true);

        if (telapaciente.isVisible()) {
            bloquearBotoes();
        } else {
            desbloquearBotoes();
        }
    }    

public void bloquearBotoes() {
        btnPaciente.setEnabled(false);
        btnMedico.setEnabled(false);
        btnConsulta.setEnabled(false);
        btnFuncionario.setEnabled(false);
        btnRelatorio.setEnabled(false);
    }

    public void desbloquearBotoes() {
        btnPaciente.setEnabled(true);
        btnMedico.setEnabled(true);
        btnConsulta.setEnabled(true);
        btnFuncionario.setEnabled(true);
        btnRelatorio.setEnabled(true);

    }

Vai entrar sempre no if e nunca no else já que acabaste de criar a tela e fazer o setVisible a true

Realmente não faz muito sentido essa verificação. Isso foi uma das últimas tentativas que fiz e não obtive sucesso. Você tem alguma dica de como fazer para ele ativar os botões quando o JInternalFrame for fechado ? Grato.

Você precisa adicionar um listener para ser notificado quando a janela é fechada.

private void btnPacienteActionPerformed(java.awt.event.ActionEvent evt) {                                            
    final TelaPaciente telapaciente = new TelaPaciente();

    telaPaciente.addInternalFrameListener(new InternalFrameAdapter() {
        // este método será chamado pelo internal frame quando ele for fechado
        public void internalFrameClosed(InternalFrameEvent e) {
            jDesktopPane1.remove(telapaciente);
            desbloquearBotoes();
        }
    });
    
    bloquearBotoes();
    jDesktopPane1.add(telapaciente);
    telapaciente.setVisible(true);
}

Outra coisa, pra que ter um método bloquearBotoes() e um desbloquarBotoes() ?
O código deles é repetido, só muda o true e false.

Eu criaria só este método:

public void bloquearBotoes(boolean bloquear) {
    btnPaciente.setEnabled(!bloquear);
    btnMedico.setEnabled(!bloquear);
    btnConsulta.setEnabled(!bloquear);
    btnFuncionario.setEnabled(!bloquear);
    btnRelatorio.setEnabled(!bloquear);
}

E faria meu código assim:

private void btnPacienteActionPerformed(java.awt.event.ActionEvent evt) {                                            
    final TelaPaciente telapaciente = new TelaPaciente();

    telaPaciente.addInternalFrameListener(new InternalFrameAdapter() {

        public void internalFrameClosed(InternalFrameEvent e) {
            jDesktopPane1.remove(telapaciente);
            bloquearBotoes(false);
        }
    });
    
    bloquearBotoes(true);
    jDesktopPane1.add(telapaciente);
    telapaciente.setVisible(true);
}
1 curtida

Muito obrigado pela ajuda! Eu não conhecia o padrão observer. Por isso não sabia como fazer para saber se o JInternalFrame foi fechado e assim chamar o método de ativar os botões. E também obrigado pela dica do método bloquearBotoes().

É muito importante sempre ler a documentação das classes que você utiliza