Mas o caracter ‘A’ no MaskFormatter é justamente uma letra e é isso que ele quer evitar.
L
lina
Realmente,
foi a resposta mais tosca que coloquei até hj!
Onde estou com a cabeça! ha
J
jurunaloco
hehe… mas de qualquer forma Obrigado por contribuir
F
fghack
Realmente,
foi a resposta mais tosca que coloquei até hj!
Onde estou com a cabeça! ha
Você é linda, a gente perdoa :lol:
M
marcobiscaro2112
Realmente,
foi a resposta mais tosca que coloquei até hj!
Onde estou com a cabeça! ha
Acontece…
Quanto à dúvida, o zero não entra como nenhum tipo de caracter no construtor de MaskFormatter. Ou seja, o zero NÃO significa que haverá obrigatóriamente ao menos uma casa inteira e duas decimais. Se você usar somente: ("#,###.##") não resolve?
J
jurunaloco
Realmente,
foi a resposta mais tosca que coloquei até hj!
Onde estou com a cabeça! ha
Acontece…
Quanto à dúvida, o zero não entra como nenhum tipo de caracter no construtor de MaskFormatter. Ou seja, o zero NÃO significa que haverá obrigatóriamente ao menos uma casa inteira e duas decimais. Se você usar somente: ("#,###.##") não resolve?
nao dá certo… ele permite digitar letras normalmente… porém valida ao sair do campo… mas essa validação q o campo faz é “falhado” … funciona e as vezes nao funciona
M
marcobiscaro2112
Ou, em último caso, apele pra agressividade! Se a tecla que o usuário pressionou não for um dígito, não deixe que ela apareça. Para isso, terá que adicionar um KeyListener no seu componente de texto e escrever o método keyPressed. Algo como:
Ou, em último caso, apele pra agressividade! Se a tecla que o usuário pressionou não for um dígito, não deixe que ela apareça. Para isso, terá que adicionar um KeyListener no seu componente de texto e escrever o método keyPressed. Algo como:
public void keyPressed(KeyEvent e) {
char tecla = e.getKeyChar();
if (tecla == ',') {
if (seuComponentDeTexto.getText().contains(",") {
e.consume();
} else {
return;
}
}
if (!Character.isDigit(tecla)) {
e.consume();
}
}
bom acabei fazendo isso mesmo… fiz um método na classe pai… que varre os componentes… e de acordo com critérios ele seta o keyTyped…
Obrigado a todos
R
renzonuccitelli
Tb sempre procurei um componente para fazer o controle de entradas monetárias em Real. Como nunca encontrei, acabei fazendo uma que funcionasse de forma parecida com a entrada de valores de caixas eletrônicos. Dá uma olhada e ve se te serve:
publicclassTextFieldMoedaRealextendsJTextFieldimplementsKeyListener{privateStringBuilderlastValidNumber;privateintmaxDigits=10;/** * Aceita um BigDecimal com escala 2. * Outras escalas não são serão aceitas * * @param BigDecimal */publicvoidsetNumber(BigDecimaldecimal){if(decimal.scale()==2&&decimal.unscaledValue().toString().length()<maxDigits){lastValidNumber=newStringBuilder(decimal.unscaledValue().toString());super.setText(getRealFormat());}}/**Retorna um BigDecimal com o valor encontrando no campo * e com escala igual a 2 * * @return BigDecimal */publicBigDecimalgetNumber(){BigDecimalnumber;if(lastValidNumber.length()==0)number=newBigDecimal("0");elsenumber=newBigDecimal(lastValidNumber.toString());number.setScale(2);returnnumber.divide(newBigDecimal(100));}/**Aceita valor em centavos. * O valor não deve possuir ponto ou vírgula * * @param String */publicvoidsetText(Stringnumber){if(isNumber(number)&&number.length()<maxDigits)lastValidNumber=newStringBuilder(number);elseif("".equals(number))lastValidNumber=newStringBuilder();super.setText(getRealFormat());}privatebooleanisNumber(Stringnumber){for(charc:number.toCharArray()){if(!Character.isDigit(c))returnfalse;}returntrue;}publicTextFieldMoedaReal(){super();this.setCaretPosition(this.getText().length());this.addKeyListener(this);lastValidNumber=newStringBuilder();super.setText(getRealFormat());}@OverridepublicvoidkeyPressed(KeyEvente){}@OverridepublicvoidkeyReleased(KeyEvente){if(Character.isDigit(e.getKeyChar())&&lastValidNumber.length()<maxDigits){lastValidNumber.append(e.getKeyChar());}elseif(e.getKeyCode()==KeyEvent.VK_BACK_SPACE||e.getKeyCode()==KeyEvent.VK_DELETE){if(lastValidNumber.length()>0){lastValidNumber.deleteCharAt(lastValidNumber.length()-1);}}super.setText(getRealFormat());}@OverridepublicvoidkeyTyped(KeyEvente){}privateStringgetRealFormat(){if(lastValidNumber.length()==0)return"0,00";elseif(lastValidNumber.length()==1)return"0,0"+lastValidNumber;elseif(lastValidNumber.length()==2)return"0,"+lastValidNumber;elsereturnbuildPrefixSeparatedWithDots()+lastValidNumber.substring(lastValidNumber.length()-2);}privateStringbuildPrefixSeparatedWithDots(){StringBuilderbuilder=newStringBuilder();for(intindex=0;index<lastValidNumber.length()-2;++index){builder.append(lastValidNumber.charAt(index));if((lastValidNumber.length()-index)%3==0&&lastValidNumber.length()-index>5)builder.append(".");}builder.append(',');returnbuilder.toString();}publicintgetMaxDigits(){returnmaxDigits;}publicvoidsetMaxDigits(intmaxDigits){this.maxDigits=maxDigits;}}
J
jurunaloco
uoww renzonuccitelli
fera esse seu código… valeu…
no caso do netbeans… sera que é possivel adicionar a paleta e trabalhar de forma visual com ele ?
Agora me diz uma coisa… Não achaste nada mesmo pela API do JFormattedTextField ???
Falows
R
renzonuccitelli
Eu dei uma boa lida na API e em outras coisas ligadas ao assunto. Vi que teria como fazer a validação usando um AbstractDocument, num tutorial aki do GUJ msm, mas achei muito enrolado o processo. A coisa boa dele é que não teria o efeito de os caracteres aparecerem primeiro e depois serem corrigidos, como acontece na classe que postei, mas isso não foi um problema para minha aplicação.