Preciso ter um campo para ler uma data, ex: dd/mm/aaaa e tambem de um JtextField que aceite apenas numeros.
:arrow: Como fazer para que um JTextField fico por exemplo com um formato assim: … /…/…
sou seja… ja fica aparentemente mostrando que eh um campo de data, ae o cara escreve primeiro o dia ja pula para mes… etc…
:arrow: E como limitar um JTextField para que aceite apenas numero??? Faço isso com KeyListener?? Com setDocument( new MeuPlainDocument() ) ) …???
alguem tem alguma sugestão melhor para esse tipo de coisa
Obrigado.
Qual a diferenca em usar mascara ou Document???
Parecem ser bem parecidos…
leonardom
“Hempx”:
Qual a diferenca em usar mascara ou Document???
Parecem ser bem parecidos…
Só que com Document você tem que fazer todo o tratamento, enquanto com as classes JFormattedTextField e MaskFormatter já fazem isso por você.
danieldestro
Tem como eu “setar” um MaskFormatter para o JFormattedTextField depois que ele foi criado?
ex:
JFormattedTextField j1 = new JFormattedTextField(); j1.setFormatter( new MaskFormatter("###.##") );
Tem como?
leonardom
“danieldestro”:
Tem como eu “setar” um MaskFormatter para o JFormattedTextField depois que ele foi criado?
ex:
JFormattedTextField j1 = new JFormattedTextField(); j1.setFormatter( new MaskFormatter("###.##") );
Tem como?
Daniel tem sim, é só usar o método install da classe MaskFormatter.
JFormattedTextField j1 = new JFormattedTextField(); new MaskFormatter("###.##").install( j1 );
danieldestro
Na verdade o que eu quero é que meu campo (JFormattedTextField) tenha a seguinte máscara: //____, e se possível apenas receba uma dáta válida, segundo a máscara passada (ex: dd/MM/yyyy).
Algum código de exemplo? To apanhando aqui.
Creio que tem que usar o PlainDocument, né? Isso não seria arrumado no jdk 1.4.2?
leonardom
É Daniel a máscara não seria problema, mas a validação vc tem que desenlvolver. No MaskFormat tem apenas como vc configurar para aceitar somente números, mas para validar tem que ser na unha. Agora se isso seria arrumado numa futura versão, só os deuses sabem, vamos torcer que sim.
danieldestro
Mas esse JFormattedTextField é MUITO chato…
eu coloquei a máscara SimpleDateFormat(“dd/MM/yyyy”), e quando eu digito ele não aparece a máscara no campo e quando o formato é inválido ou a data some ou ele coloca outra… WEIRDDD
luiz_ross
Um JTextField customizado que só aceita numeros
/* * * Tipo: JNumberField */importjavax.swing.*;importjavax.swing.text.*;importjava.awt.Toolkit;importjava.text.NumberFormat;importjava.text.ParseException;importjava.util.Locale;/*** JTextField personalizado permitindo somente números.*/publicclassJNumberFieldextendsJTextField{privateToolkittoolkit;privateNumberFormatintegerFormatter;privateintmaxDigits;/** * Constrói um novo JNumberField com máximo de caracteres igual a maxNoDigits. * * @param maxNoDigits Um inteiro contendo o número máximo de caracteres do campo. */publicJNumberField(intmaxNoDigits){super(4);toolkit=Toolkit.getDefaultToolkit();integerFormatter=NumberFormat.getNumberInstance(Locale.US);integerFormatter.setParseIntegerOnly(true);if(maxNoDigits<1){maxDigits=99;}else{maxDigits=maxNoDigits;}}/** * Construtor, Constrói um novo JNumberField com tamanho máximo de 99. */publicJNumberField(){super(4);toolkit=Toolkit.getDefaultToolkit();integerFormatter=NumberFormat.getNumberInstance(Locale.US);integerFormatter.setParseIntegerOnly(true);maxDigits=99;}/** * Retorna o comprimento do JNumberField. * * @return Um inteiro contendo o total de caracteres no campo. */publicintgetlength(){StringfieldValue=getText();return(fieldValue.length());}/** * Retorna o valor do JNumberField. * * @return Um inteiro contendo o texto do campo. */publicintgetValue(){intretVal=0;try{retVal=integerFormatter.parse(getText()).intValue();}catch(ParseExceptione){// Isto nunca deveria acontecer porque insertString permite// apenas dados propriamente formatados para inserir no JNumberField.toolkit.beep();}returnretVal;}/** * Seta o valor passado no JNumberField. * * @param value Um inteiro contendo o valor a ser escrito no campo. */publicvoidsetValue(intvalue){setText(integerFormatter.format(value));}/** * Seta o número máximo de caracteres no JNumberField. * * @param value um inteiro contendo a capacidade máxima do campo. */publicvoidsetMaxDigits(intvalue){if(value>0){maxDigits=value;}}/** * Retorna o número máximo de caracteres no JNumberField. * * @return Um inteiro contendo o máximo de caracteres suportado pelo campo. */publicintgetMaxDigits(){returnmaxDigits;}/** * Limpa o JNumberField. */publicvoidclearField(){setText("");}/** * Cria um novo documento padrão para o campo. * * @return Um documento novo que será aplicado no componente. */protectedDocumentcreateDefaultModel(){returnnewWholeNumberDocument();}protectedclassWholeNumberDocumentextendsPlainDocument{/** * Insere o texto digitado no campo, conforme ele é digitado. * Caso um caracter não permitido seja digitado, não é exibido. * * @param offs Um inteiro contendo a capacidade do campo. * @param str Uma String contendo o texto a ser inserido no campo. * @param a Um AttributeSet contendo os atributos. */publicvoidinsertString(intoffs,Stringstr,AttributeSeta)throwsBadLocationException{char[]source=str.toCharArray();char[]result=newchar[source.length];intj=0;for(inti=0;i<result.length;i++){//impede a quebra de linha de ser mostrada no campo.if((Character.isWhitespace(source[i])||Character.isDigit(source[i]))&&(offs<(maxDigits))&&(int)source[i]!=10)result[j++]=source[i];elsetoolkit.beep();}super.insertString(offs,newString(result,0,j),a);}}}
danieldestro
Obrigado, bem legal.
mas ninguem tem nada usando JFormattedTextField>>>
dukejeffrie
Cara, faz uma busca aqui no GUJ por FixedLengthDocument (ou variações) e PlainDocument.
Vc pode colocar uma máscara no seu JFormattedTextField e associar a ele um Document que só aceita números e que automaticamente tem nas posições 3 e 6 as barrinhas…
eu não disse que seria divertido… : ))))
[]s!
D
ddpcc
private JFormattedTextField TDtNascto;
try {
MaskFormatter format = new MaskFormatter("##/##/####");
TDtNascto = new JFormattedTextField(format);
TDtNascto.setBounds(110,80,80,20);
this.getContentPane().add(TDtNascto);
}
catch(Exception ex)
{}