[Resolvido]JOptionpane

8 respostas
filipi

Bom dia,

Estou com o seguinte problema, tenho um frame e haviam alguns diálogos que estavam executando por trás desse frame. Pesquisei e descobri que utilizando o “this” ao invés do “null” resolvia o problema, e realmente resolve nos diálogos que estão na mesma classe que o frame. Porém eu tenho um dialogo que está em uma outra classe,e não estou conseguindo substituir o “null” pelo “this”,apresenta o erro de que o método está errado. Está dessa forma sem o erro:

JOptionPane.showMessageDialog(null,"Cliente não encontrado");

Há alguma outra forma de fazer?

8 Respostas

douglaskd

filipi:
Bom dia,

Estou com o seguinte problema, tenho um frame e haviam alguns diálogos que estavam executando por trás desse frame. Pesquisei e descobri que utilizando o “this” ao invés do “null” resolvia o problema, e realmente resolve nos diálogos que estão na mesma classe que o frame. Porém eu tenho um dialogo que está em uma outra classe,e não estou conseguindo substituir o “null” pelo “this”,apresenta o erro de que o método está errado. Está dessa forma sem o erro:

JOptionPane.showMessageDialog(null,"Cliente não encontrado");

Há alguma outra forma de fazer?

o showMessageDialog recebe um Jframe no primeiro parâmetro, provavelmente a classe que possuí esse JOptionPane não extende um Jframe, sendo assim ela não é um Jframe.

se você deixa null, qual o problema ?, a mensagem aparece atraz do seu Jframe ?

filipi

Sim realmente essa classe em questão não estende um frame, e sim o problema é justamente esse,essa mensagem está aparecendo atras do frame e não possibilita a troca pelo “this” gera erro. Há alguma forma de resolver isso??

E

Ora, é porque você não teve a oportunidade de ler códigos corretos. Nunca use null num JOptionPane.showMessageDialog: use sempre uma referência para o JFrame ou JDialog que está chamando o JOptionPane.

Suponha que você esteja querendo chamar o JOptionPane em um actionListener de um JButton e esse actionListener está em uma classe derivada de JFrame (ou JDialog) chamada MeuCadastro.

Você já percebeu que “this” , sozinho, não funciona, porque o “this” refere-se à classe anônima que implementa o ActionListener, não ao JFrame.

Você tem de usar algo como

MeuCadastro.this

em vez de simplesmente this. Assim você estará referenciando o this da classe do JFrame ou JDialog, não o this da classe anônima.

Certo?

douglaskd
filipi:
Sim realmente essa classe em questão não estende um frame, e sim o problema é justamente esse,essa mensagem está aparecendo atras do frame e não possibilita a troca pelo "this" gera erro. Há alguma forma de resolver isso??

o entanglement tem razão, alias, o JOptionPane é parte do View da sua aplicação, ele não deveria aparecer em uma classe secundaria, seu método poderia retornar um Texto/uma Constante/um item de um Enum, e seus Jframes serem os responsaveis por imprimir a mensagem.

mas....se você quizer continuar a fazer assim, passe o Jframe que chama esse método deste classe como parâmetro e coloque ele no lugar do this.

seuMetodoDaClasse(Jframe jframequechamaometodo){

jOptionPane.showMessageDialog(jframequechamaometodo, "aqui sua mensagem");

}

mas ja vou dizendo que esta forma não parece "correta" pra mim.

filipi

Sim amigos em minha concepção também está não está correto. No meu caso esse dialogo está dentro de um método busca o que não é correto, o método busca apenas tem que fazer a busca e não fazer a busca e apresentar um dialogo. O que aconteceu no meu caso foi o seguinte, tenho uma lista no meu método busca, e na classe do frame quando chamo esse método teria que fazer uma “validação” , verificaria se a lista esta vazia e se a a busca retornou resultado. Como não consegui percorrer a lista no frame "improvisei’ e coloquei um if na busca que ficou assim :

public List<Clientes> buscaCliente(String nome)throws SQLException{
                List<Clientes> pesquisa = new ArrayList<>();
                
                String select = "select * from cliente where nome = ?";
                PreparedStatement state = getConnection().prepareStatement(select);
                state.setString(1,nome);
                ResultSet set = state.executeQuery();
                
                 while(set.next()){
                            Clientes cli = new Clientes();
                            cli.setId(set.getInt("id"));
                            cli.setNome(set.getString("nome"));
                            cli.setEnd(set.getString("endereco"));
                            cli.setTel(set.getString("telefone"));
                            cli.setRg(set.getInt("rg"));
                            cli.setCpf(set.getInt("cpf"));
                            pesquisa.add(cli);
            }
                 set.close();
                 state.close();
                 
                 if( pesquisa.isEmpty() == true){
                   
                   JOptionPane.showMessagemDialog(null,"Cliente não encontrado");
                
                 }
                 return pesquisa;
            }

No caso esse “if” seria descartado.

E ai foi onde o dialogo ficou atras do frame. Mas sei que não é o correto porém não sei como percorrer a lista lá no frame. Peço a vossa ajuda para fazer da forma correta e percorrer essa lista lá no frame,onde implementariamos essa validação e verificaria se está vazia ou se não encontrou a informação.

filipi

Removi o if desse método e criei na classe que do frame o seguinte método

private void validaDados(List<Clientes> cli){
       Iterator <Clientes> it = cli.iterator();
       if(it.hasNext() == false){
           JOptionPane.showMessageDialog(this,"Dados inválidos");
       }
       }

Quando a pesquisa está vazia ou a informação digitada não existe no BD ele me retorna esse dialogo.

Dessa maneira está correto fazer?

Aparenta ter dado certo…rsrsrs

E

É a melhor forma (o ideal é você seguir o modelo MVC, ou seja, separe o acesso a dados (que é a busca da lista) da visualização deles (no seu caso, mensagens de erro mostradas para o usuário também contam como visualização. )

filipi

Que bom que esta correto agora. Muito Obrigado!

Criado 15 de julho de 2013
Ultima resposta 16 de jul. de 2013
Respostas 8
Participantes 3