Método dispose(); [RESOLVIDO]

13 respostas
C

Bom, estou desenvolvendo um sistema de biblioteca e em uma das telas faço uma consulta pra verificar se um aluno já possui empréstimo pendente, no caso de ele não possuir ele abre um novo formulário para cadastrar os dados do empréstimo.

Quando eu clicar em cadastrar quero que o formulário de consulta feche e o formulário de empréstimo abra.
O problema é que o método de tratamento da consulta está em uma classe DAO e o método dispose(); não funciona.
Por algum motivo o setVisible(false); também não fecha o formulário.

Esse é o método:

public Aluno selectStatus(int matricula) throws SQLException, ClassNotFoundException {
                Aluno aluno= null;
                Connection conn = null;
                PreparedStatement pstmt = null;
                ResultSet rs = null;
		try {
                        conn = getConnection();
			pstmt = super.prepareStatement( conn, SELECT_STATUS );
			pstmt.setInt(1, matricula);
			rs = pstmt.executeQuery();
			rs.setFetchSize( 1 );

			if( rs.next() ) {
				String Status = rs.getString("STATUS");

                                if(Status.equals("ATIVADO")){
                                    JOptionPane.showMessageDialog(null,"O ALUNO JÁ POSSUI EMPRÉSTIMO PENDENTE!");
                                }

                                if(Status.equals("DESATIVADO")){
                                    JOptionPane.showMessageDialog(null,"O ALUNO PODE EFETUAR EMPRÉSTIMO!");
                                    new CadastroEmprestimo().setVisible(true);
                                    
                                }

                                aluno = new Aluno();
			} else {
				throw new SQLException("MATRÍCULA não encontrada!");
			}
		} finally {
			release(conn, pstmt, null);
		}
		return aluno;
}

O que posso fazer? Alguém me dá uma luz!

13 Respostas

V

E onde está o setVisible o o dispose() nesse código?

L

Amigo o metodo a ser chamado é o SeuFrame.setVisible(false): o dispose é chamado automatico caso o evento Close do seu frame seja DISPOSE.

Tem como postar o código do botão

C

Logo depois da linha:

Eu coloquei:

Tirei porque não tava funcionando.

V

O problema era justamente esse “new” aí. Se você dá new, você cria uma nova janela. E então, mandou ela ficar invisível.

Se esse evento já está na janela cadastrar emprestimo, chame:

Sem nada. Ou então:

C

É Vini, mas mesmo assim também não funcionou.

Alguma outra coisa que eu possa fazer?

C

A classe de consulta:

package biblioteca.gui;

import biblioteca.model.Aluno;
import biblioteca.service.AlunoService;
import javax.swing.JOptionPane;

/**
 *
 * @author Camila
 */

public class ConsultarStatus extends javax.swing.JFrame {

    /** Cria novo formulário para consulta de matrícula */

    public ConsultarStatus() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jLabel9 = new javax.swing.JLabel();
        categoria = new javax.swing.JTextField();
        jLabel7 = new javax.swing.JLabel();
        matricula = new javax.swing.JTextField();
        consultar = new javax.swing.JButton();
        limpar = new javax.swing.JButton();
        voltar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel5.setFont(new java.awt.Font("Times New Roman", 1, 14));
        jLabel5.setText("Informe abaixo os dados referentes ao solicitante do empréstimo:");

        jLabel6.setFont(new java.awt.Font("Times New Roman", 1, 24));
        jLabel6.setText("Consultar Status");

        jLabel9.setFont(new java.awt.Font("Times New Roman", 1, 18));
        jLabel9.setText("Categoria:");

        categoria.setFont(new java.awt.Font("Times New Roman", 2, 14));
        categoria.setForeground(new java.awt.Color(204, 204, 255));

        jLabel7.setFont(new java.awt.Font("Times New Roman", 1, 18));
        jLabel7.setText("Matrícula:");

        matricula.setFont(new java.awt.Font("Times New Roman", 2, 14));
        matricula.setForeground(new java.awt.Color(204, 204, 255));

        consultar.setFont(new java.awt.Font("Times New Roman", 1, 18));
        consultar.setText("Consultar");
        consultar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                consultarActionPerformed(evt);
            }
        });

        limpar.setFont(new java.awt.Font("Times New Roman", 1, 18));
        limpar.setText("Limpar");
        limpar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                limparActionPerformed(evt);
            }
        });

        voltar.setFont(new java.awt.Font("Times New Roman", 1, 18));
        voltar.setText("Voltar");
        voltar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                voltarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(28, 28, 28)
                        .addComponent(consultar)
                        .addGap(41, 41, 41)
                        .addComponent(limpar)
                        .addGap(36, 36, 36)
                        .addComponent(voltar))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(122, 122, 122)
                        .addComponent(jLabel6))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(20, 20, 20)
                        .addComponent(jLabel5))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(95, 95, 95)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel9)
                            .addComponent(jLabel7))
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(categoria)
                            .addComponent(matricula, javax.swing.GroupLayout.PREFERRED_SIZE, 129, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addContainerGap(16, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel6)
                .addGap(18, 18, 18)
                .addComponent(jLabel5)
                .addGap(26, 26, 26)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel9)
                        .addGap(18, 18, 18)
                        .addComponent(jLabel7))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(categoria, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(matricula, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(52, 52, 52)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(consultar)
                    .addComponent(limpar)
                    .addComponent(voltar))
                .addContainerGap(23, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void consultarActionPerformed(java.awt.event.ActionEvent evt) {                                          

       if(categoria.getText().equals("")){
           JOptionPane.showMessageDialog(null, "O campo CATEGORIA não pode ser nulo!");
           return;
       }

       if(!categoria.getText().equals("ALUNO") && !categoria.getText().equals("PROFESSOR")
          && !categoria.getText().equals("FUNCIONARIO")){
           JOptionPane.showMessageDialog(null, "O campo CATEGORIA deve ser preenchido com uma das opções abaixo:"
                                              + "\n 1. ALUNO"
                                              + "\n 2. PROFESSOR"
                                              + "\n 3. FUNCIONARIO");
           categoria.setText(null);
           return;
       }

       if(matricula.getText().equals("")){
           JOptionPane.showMessageDialog(null, "O campo MATRÍCULA não pode ser nulo!");
           return;
       }

       if(categoria.getText().equals("ALUNO")){

           Aluno aluno = new Aluno();
           try {

                String Smatricula = matricula.getText();

                if(Smatricula.length()>7){
                    JOptionPane.showMessageDialog(null, "O campo MATRÍCULA não pode conter mais de 7 dígitos!");
                    matricula.setText(null);
                    return;
                }

                aluno.setMatricula(Smatricula);
           }

            catch (NumberFormatException e){
                 JOptionPane.showMessageDialog(null,"O campo MATRÍCULA deve conter apenas números!" );
                 matricula.setText(null);
                 return;
            }

        //Consulta:
        try{
            AlunoService.getInstance().selectStatus(aluno.getMatricula());
        }

        catch(Exception e){
            JOptionPane.showMessageDialog(null,"Erro : " + e.getMessage());
        }

       }
}                                         

    public void limpaDados(){
        categoria.setText(null);
        matricula.setText(null);
    }

    private void limparActionPerformed(java.awt.event.ActionEvent evt) {                                       
        limpaDados();
}                                      

    private void voltarActionPerformed(java.awt.event.ActionEvent evt) {                                       
        new PaginaInicial().setVisible(true);
        dispose();
}                                      

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ConsultarStatus().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JTextField categoria;
    private javax.swing.JButton consultar;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JButton limpar;
    private javax.swing.JTextField matricula;
    private javax.swing.JButton voltar;
    // End of variables declaration                   

}
C

O método selectStatus, na classe Service:

public Aluno selectStatus(int matricula) throws AlunoException { Aluno aluno = null; AlunoDAO alunoDAO = null; try { alunoDAO = mysqlDAOFactory.getAlunoDAO(); alunoDAO.getConnection(); aluno = alunoDAO.selectStatus( matricula ); } catch (SQLException e) { throw new AlunoException("MATRÍCULA não encontrada! ", e); } catch (Exception e) { throw new AlunoException("MATRÍCULA não encontrada!", e); } return aluno; }

C

E o método selectStatus da classe DAO:

public Aluno selectStatus(int matricula) throws SQLException, ClassNotFoundException, LivroException {
                Aluno aluno= null;
                Livro livro = null;
                Connection conn = null;
                PreparedStatement pstmt = null;
                ResultSet rs = null;
		try {
                        conn = getConnection();
			pstmt = super.prepareStatement( conn, SELECT_STATUS );
			pstmt.setInt(1, matricula);
			rs = pstmt.executeQuery();
			rs.setFetchSize( 1 );

			if( rs.next() ) {
				String Status = rs.getString("STATUS");

                                if(Status.equals("ATIVADO")){
                                    JOptionPane.showMessageDialog(null,"O ALUNO JÁ POSSUI EMPRÉSTIMO PENDENTE!");
                                }

                                if(Status.equals("DESATIVADO")){
                                    JOptionPane.showMessageDialog(null,"O ALUNO PODE EFETUAR EMPRÉSTIMO!");
                                    new ConsultarDisponibilidade().setVisible(true);
                                }

                                aluno = new Aluno();
			} else {
				throw new SQLException("MATRÍCULA não encontrada!");
			}
		} finally {
			release(conn, pstmt, rs);
		}
		return aluno;
	}
C

Alguém me ajuda!

V

Coloque o dispose() na classe ConsultarStatus, linha 183, logo depois de:

C

Mas se eu fizer isso, independente do resultado da consulta, a tela será fechada e não é isso que eu quero.
A tela só deve fechar se o aluno estiver com status "DESATIVADO". O método que faz esse teste se o status está DESATIVADO ou ATIVADO está na classe DAO, onde o dispose(); não funciona. Eu já tentei colocar um if na classe ConsultarStatus pra receber o resultado da consulta e testar o valor do status ali mesmo, mas isso acaba disparando uma exceção.

Veja como eu fiz, pra ver se tem algo errado:

try{
            AlunoService.getInstance().selectStatus(aluno.getMatricula());
            
            if(AlunoService.getInstance().selectStatus(aluno.getMatricula()).getStatus().equals("DESATIVADO")){
                dispose();
            }
        }

        catch(Exception e){
            JOptionPane.showMessageDialog(null,"Erro : " + e.getMessage());
        }
Nisso, ele abre o outro formulário duas vezes. Aí tirei a primeira linha e deixei só o if:
try{
            
            if(AlunoService.getInstance().selectStatus(aluno.getMatricula()).getStatus().equals("DESATIVADO")){
                dispose();
            }
        }

        catch(Exception e){
            JOptionPane.showMessageDialog(null,"Erro : " + e.getMessage());
        }

Mas mesmo assim não fecha e aparece a mensagem "Erro: null", que é a exceção.
Obs.: Isso aconteceu nas duas tentativas.

V

Ao invés de retornar o aluno, faça seu método selectStatus retornar a String do status. Aí é só testar diretamente.
Seu dao está simplesmente retornando um new Aluno(), o que não faz sentido algum.

Aliás, a separação existe justamente para o DAO não se meter com a interface gráfica. Seu DAO não deveria estar dando mensagens num JOptionPane.

C

Eu já tinha tentado fazer dessa forma e não tinha conseguido, mas agora deu certo.
Obrigada pela sua paciência! Rsrs’

Deu certooo’

Uhuu

Criado 12 de outubro de 2011
Ultima resposta 16 de out. de 2011
Respostas 13
Participantes 3