quarta-feira, 10 de setembro de 2008

Trocando caracteres especiais no Java

Oi povo.

Já vi muita gambiarra envolvendo replace e tals, pra trocar caracteres especiais no Java (fazer isso "Tralalá" virar isso "Tralala"). Daí vi esse código e achei mais bonitinho.. pelo menos não envolve 3 arrays, um vetor e um comentário do tipo /* Revisar depois */


public static String formatString(String s) {
String temp = Normalizer.normalize(s, java.text.Normalizer.Form.NFD);
return temp.replaceAll("[^\\p{ASCII}]","");
}


Abraço, povo o/

quarta-feira, 3 de setembro de 2008

Disparando eventos no JTextField

Oi povo,

Muitas vezes, você precisa validar algum campo, que depende do conteúdo digitado em um JTextField (ou qualquer componente que use Document). Por exemplo: Quando você solicita ao usuário a digitação de um código para que apareça a descrição de um produto na tela.
Muita gente usa o KeyListener pra isso, mas ele é disparado antes do caracter ser colocado no JTextField, daí ele não pega o texto digitado por inteiro.

A solução pra isso é usar o bom e velho DocumentListener! \o/

Exemplo: busca produto pelo código digitado


JTextField textField = new JTextField();
textField.getDocument().addDocumentListener(new DocumentListener(){
public void changedUpdate(javax.swing.event.DocumentEvent e) {
// Anuncie aqui! Viu como funciona?
}
public void insertUpdate(DocumentEvent e) {
buscaProdutoPorCodigo(textField.getText());
}
public void removeUpdate(DocumentEvent e) {
buscaProdutoPorCodigo(textField.getText());
}
public void buscaProdutoPorCodigo(String codigoStr){
try{
int codigo = Integer.parseInt(codigoStr);
// busca o produto no banco;
// pega o produto e exibe no lugar certo;
} catch (NumberFormatException nfex) {
// exibe mensagem dizendo que o código é inválido.
}
}
});


Explicando:
O DocumentListener é um listener disparado toda vez que o texto do componente é alterado. Daí tem 3 métodos que tem q ser implementados: O insert, o changed e o remove.
O insert é disparado quando algum texto é inserido no componente.
O remove é disparado quando algum texto é removido do componente.
E o changed só é disparado quando o estilo do texto muda (isso só é aplicável com componentes que implementam StyledDocument, como o JTextPane. Não é aplicável ao JTextField, portanto ali no código ele tá só fazendo figuração =D ).

Té mais, povo o/