Realmente,
foi a resposta mais tosca que coloquei até hj!
Onde estou com a cabeça! ha[/quote]
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?
Realmente,
foi a resposta mais tosca que coloquei até hj!
Onde estou com a cabeça! ha[/quote]
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?[/quote]
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
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();
}
}
[quote=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:
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();
}
}
[/quote]
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…
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:
[code]public class TextFieldMoedaReal extends JTextField implements KeyListener {
private StringBuilder lastValidNumber;
private int maxDigits=10;
/**
* Aceita um BigDecimal com escala 2.
* Outras escalas não são serão aceitas
*
* @param BigDecimal
*/
public void setNumber(BigDecimal decimal){
if(decimal.scale()==2&&decimal.unscaledValue().toString().length()<maxDigits){
lastValidNumber=new StringBuilder(decimal.unscaledValue().toString());
super.setText(getRealFormat());
}
}
/**Retorna um BigDecimal com o valor encontrando no campo
* e com escala igual a 2
*
* @return BigDecimal
*/
public BigDecimal getNumber(){
BigDecimal number;
if(lastValidNumber.length()==0)
number=new BigDecimal("0");
else
number=new BigDecimal(lastValidNumber.toString());
number.setScale(2);
return number.divide(new BigDecimal(100));
}
/**Aceita valor em centavos.
* O valor não deve possuir ponto ou vírgula
*
* @param String
*/
public void setText(String number){
if(isNumber(number)&&number.length()<maxDigits)
lastValidNumber=new StringBuilder(number);
else if("".equals(number))
lastValidNumber=new StringBuilder();
super.setText(getRealFormat());
}
private boolean isNumber(String number){
for(char c: number.toCharArray()){
if(!Character.isDigit(c))
return false;
}
return true;
}
public TextFieldMoedaReal() {
super();
this.setCaretPosition(this.getText().length());
this.addKeyListener(this);
lastValidNumber=new StringBuilder();
super.setText(getRealFormat());
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
if(Character.isDigit(e.getKeyChar())&&lastValidNumber.length()<maxDigits){
lastValidNumber.append(e.getKeyChar());
}
else if(e.getKeyCode()==KeyEvent.VK_BACK_SPACE||e.getKeyCode()==KeyEvent.VK_DELETE){
if(lastValidNumber.length()>0){
lastValidNumber.deleteCharAt(lastValidNumber.length()-1);
}
}
super.setText(getRealFormat());
}
@Override
public void keyTyped(KeyEvent e) {
}
private String getRealFormat(){
if(lastValidNumber.length()==0)
return "0,00";
else if(lastValidNumber.length()==1)
return "0,0"+lastValidNumber;
else if(lastValidNumber.length()==2)
return "0,"+lastValidNumber;
else
return buildPrefixSeparatedWithDots()+lastValidNumber.substring(lastValidNumber.length()-2);
}
private String buildPrefixSeparatedWithDots(){
StringBuilder builder=new StringBuilder();
for(int index=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(',');
return builder.toString();
}
public int getMaxDigits() {
return maxDigits;
}
public void setMaxDigits(int maxDigits) {
this.maxDigits = maxDigits;
}
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.