Bom dia!
Preciso que no meu JTextField, não seja permitido a digitação de números. Até aí, sem problemas, mas gostaria que no momento que o usuário digitasse algum número, aparecesse um JOptionPane informando que apenas letras serão permitidas neste campo.
Do jeito que meu sistema encontra-se neste momento, apenas as letras são permitidas, os números não aparecem no JTextField, apenas gostaria de acrescentar esta mensagem. Segue meu código:
JTextField
tfResponsavel = new javax.swing.JTextField();
tfResponsavel.setDocument(new FormataTexto(20, 'E')); //permite no máximo 20 caracteres, somente letras maiusculas
Classe FormataTexto
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public class FormataTexto extends PlainDocument {
private int iMaxLength = 0;
private char tipo;
Pattern texto;
public FormataTexto(int maxlen, char tp) {
super();
iMaxLength = maxlen;
tipo = tp;
}
public String formatar (String entrada, Integer valor){
// 1 - somente letras e números
// 2 - somente numeros
// 3 - somente letras
if (valor == 1){
texto = Pattern.compile("[0-9a-z]",Pattern.CASE_INSENSITIVE);
} else if (valor == 2){
texto = Pattern.compile("[0-9]",Pattern.CASE_INSENSITIVE);
} else if (valor == 3){
texto = Pattern.compile("[a-z]",Pattern.CASE_INSENSITIVE);
}
Matcher encaixe = texto.matcher(entrada);
StringBuffer saida = new StringBuffer();
while(encaixe.find())
saida.append(encaixe.group());
return saida.toString();
}
@Override
public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
if ( str == null ) return;
boolean ok = true;
if ( iMaxLength <= 0 ) {// aceitara qualquer no. de caracteres
super.insertString( offset, str, attr );
return;
}
// A = TUDO
// B - SOMENTE LETRAS E NÚMEROS EM MAIÚSCULO
// C - somente letras e números em minúsculo
// D - SOMENTE NÚMEROS
// E - SOMENTE LETRAS MAIÚSCULO
// F - SOMENTE LETRAS minúsculo
switch(tipo) {
case 'B': str = formatar(str.toUpperCase(), 1); break;
case 'C': str = formatar(str.toLowerCase(), 1); break;
case 'D': str = formatar(str, 2); break;
case 'E': str = formatar(str.toUpperCase(), 3); break;
case 'F': str = formatar(str.toLowerCase(), 3); break;
}
int ilen = (getLength() + str.length());
if ( ilen <= iMaxLength ) // se o comprimento final for menor...
super.insertString( offset, str, attr ); // aceita str
else {
if ( getLength() == iMaxLength ) return; // nada a fazer
String newStr = str.substring(0, (iMaxLength - getLength()));
super.insertString( offset, newStr, attr );
}
}
}
Agradeço pela ajuda!
Cara até te compreendo fazer isso , mas acho desnecessário ficar aparecendo msg que não pode ser colocado letra ou nunmero no Jtext
no meu projeto eu faço dessa forma vê se consegue entender à logica:
Crie uma classe
[code]package util;
import java.awt.Toolkit;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
/**
- Classe Utilit�ria que filtra os valores dentro de um textfield.
-
-
@author achiang
-
*/
public class JTextFieldFilter extends PlainDocument {
private static final long serialVersionUID = 7849760310991654101L;
/* TIPOS GENÉRICOS */
public static final String LOWERCASE = "abcdefghijklmnopqrstuvwxyz ";
public static final String UPPERCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ";
public static final String UPPERCASE_NO_SPACE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static final String LOWERCASE_SPECIAL = "áâéíõúçãàêóôü";
public static final String UPPERCASE_SPECIAL = "ÁÂÉÍÕÚÇÃÀÊÓÔÜ";
public static final String ALPHA = LOWERCASE + UPPERCASE;
public static final String NUMERIC = "0123456789";
public static final String DECIMAL = NUMERIC + "," + ".";
public static final String PONTO = ".";
public static final String UPPERCASE_NUMERIC_PONTO = UPPERCASE + NUMERIC + PONTO;
public static final String UPPERCASE_NUMERIC = UPPERCASE + NUMERIC;
public static final String UPPERCASE_NUMERIC_NO_SPACE = UPPERCASE_NO_SPACE + NUMERIC;
public static final String LOWERCASE_NUMERIC = LOWERCASE + NUMERIC;
public static final String ALPHA_NUMERIC = ALPHA + NUMERIC;
public static final String ALPHA_NUMERIC_UPPERCASE = UPPERCASE + NUMERIC;
private static final String SPECIAL = "ºª";
public static final String ENDERECO = UPPERCASE.trim() + DECIMAL + LOWERCASE;
public static String FULL = ALPHA_NUMERIC + LOWERCASE_SPECIAL + UPPERCASE_SPECIAL + SPECIAL;
/* TIPOS PRÉ DEFINIDOS */
public static final String DATE = NUMERIC + "/";
public static final String CEP = NUMERIC + "-";
public static final String EMAIL = "abcdefghijklmnopqrstuvwxyz" + NUMERIC + "_@-.+";
protected String acceptedChars = null;
protected boolean negativeAccepted = false;
protected int maxLength = 100;
public JTextFieldFilter() {
this(ALPHA_NUMERIC);
}
public JTextFieldFilter(String acceptedchars) {
this.acceptedChars = acceptedchars;
}
public JTextFieldFilter(String acceptedchars, int maxLength) {
this.acceptedChars = acceptedchars;
this.maxLength = maxLength;
}
public void setNegativeAccepted(boolean negativeaccepted) {
if (acceptedChars.equals(NUMERIC) || acceptedChars.equals(DECIMAL)
|| acceptedChars.equals(ALPHA_NUMERIC) || acceptedChars.equals(DATE)
|| acceptedChars.equals(CEP)) {
negativeAccepted = negativeaccepted;
acceptedChars += "-";
}
}
@SuppressWarnings("static-access")
public void insertString(int offset, String str, AttributeSet attr)
throws BadLocationException {
if (str == null)
return;
// estudar sobre campos que aceitam apenas numeros..
if (acceptedChars.equals(UPPERCASE) ||acceptedChars.equals(UPPERCASE_NUMERIC) ||
acceptedChars.equals(UPPERCASE_NUMERIC+DECIMAL) || acceptedChars.equals(UPPERCASE_NUMERIC+UPPERCASE_SPECIAL) ||
acceptedChars.equals(UPPERCASE_NO_SPACE) || acceptedChars.equals(UPPERCASE_NUMERIC_NO_SPACE) ||
acceptedChars.equals(ALPHA_NUMERIC_UPPERCASE))
str = str.toUpperCase();
else if (acceptedChars.equals(LOWERCASE) || acceptedChars.equals(LOWERCASE_NUMERIC) || acceptedChars.equals(LOWERCASE_SPECIAL) ||
acceptedChars.equals(EMAIL))
str = str.toLowerCase();
for (int i = 0; i < str.length(); i++) {
if (acceptedChars.indexOf(str.valueOf(str.charAt(i))) == -1)
return;
}
if (acceptedChars.equals(DECIMAL)
|| (acceptedChars.equals(DECIMAL + "-") && negativeAccepted)) {
if (str.indexOf(".") != -1) {
if (getText(0, getLength()).indexOf(".") != -1) {
return;
}
}
}
if (negativeAccepted && str.indexOf("-") != -1) {
if (str.indexOf("-") != 0 || offset != 0) {
return;
}
}
//codigo para setar o maxlength
if (str == null) {
return;
}
int strLen = str.length();
if (strLen == 0) {
return;
}
int len = getLength();
if (strLen + len > maxLength) {
Toolkit.getDefaultToolkit().beep();
str = str.substring(0, maxLength - len);
}
//codigo para tirar espaço à esquerda
if (str.indexOf(" ")==0 && len==0){
return;
}
super.insertString(offset, str, attr);
}
/**
* Metodo maxLength
* @return maxLength
*/
public int maxLength() {
return maxLength;
}
}[/code]
em seguida é so implementar assimmm
campo_Nome.setDocument(new JTextFieldFilter(JTextFieldFilter.UPPERCASE,20));
campo_Nome.setHorizontalAlignment(javax.swing.JTextField.LEFT);
ele não deixa vc colocar números…qualquer coisa pergunta ai???
abrxx
Bom dia!
Eu utilizo uma classe de formatação um pouco diferente, mas que dá o mesmo resultado da sua sugestão. Também não acho legal a ideia da mensagem, mas acredite, os usuários daqui da empresa, vão perceber que o número não entra no JTextField e vão me ligar a toda hora.
Na verdade, estou pensando em fazer outro método de validação. Neste campo entra o nome do vendedor, vou fazer o correto, que é permitir apenas os vendedores previamente cadastrados. Não tenho este controle em meu sistema no momento. Da forma que está, qualquer código de vendedor errado e qualquer nome tipo DJABDS DJSDH SD S JS seria aceito.
Obrigado pela ajuda!
Eu faria meu document disparar um evento. Então capturaria esse evento na tela onde o JTextField está e definiria uma label em algum lugar com a mensagem de erro em vermelho. Claro que daria para mostrar o JOptionPane, mas acho a janelinha no meio da digitação de textos muito incômoda.
Enfim, qual seria o proposito para isso, pois o cara tem um campo CPF ele não vai querer usar letras…ai é brincadeira…
isso tem regras,campos END precisa de numeros e letras,CEP só numeros,Nome tbm podendo colocar números…
mas enfim, vc queria algo que verificasse se esta certo ou não e mostrasse a msg?
[quote=lokit"s]Enfim, qual seria o proposito para isso, pois o cara tem um campo CPF ele não vai querer usar letras…ai é brincadeira…
isso tem regras,campos END precisa de numeros e letras,CEP só numeros,Nome tbm podendo colocar números…
mas enfim, vc queria algo que verificasse se esta certo ou não e mostrasse a msg?
[/quote]
Acredite, o usuário vai querer colocar letras onde não pode e números onde não deve…
Eu faria essa verificação da forma que o vinigodoy sugeriu (acho muito chato aquelas janelinhas pulando a toda hora).
Enfim, um tooltip também é benvindo…