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");
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
entanglement
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 :
publicList<Clientes>buscaCliente(Stringnome)throwsSQLException{List<Clientes>pesquisa=newArrayList<>();Stringselect="select * from cliente where nome = ?";PreparedStatementstate=getConnection().prepareStatement(select);state.setString(1,nome);ResultSetset=state.executeQuery();while(set.next()){Clientescli=newClientes();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");}returnpesquisa;}
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
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
entanglement
É 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. )