JTextField mascara para quantidades

Salve galera…

Estive procurando nesse fds uma forma de trabalhar com quantidades, testei o JFormatted mas não resolveu muito para o que preciso, por isso resolvi escrever um PlainDocument estendendo o JFormatted e usar com JTextField. Vou compartilhar com vcs pq como eu precisei disso, encontrei muita gente no Google precisando tbm…ta ae !

/**
 *
 * @author fernando paiva
 */
public class JQuantidadeField extends JFormattedTextField{    
    private static final long serialVersionUID = -5712106034509737967L;
    private static final SimpleAttributeSet nullAttribute = new SimpleAttributeSet();
    private int maxLength;

    public JQuantidadeField(int maxLength) {        
        this.maxLength = maxLength;
        
        this.setDocument(new FormataQuantidadeDocument());
        this.setHorizontalAlignment(JTextField.RIGHT);        
        this.setText("0,000"); //qtd
        this.addFocusListener(new FocusAdapter() {
            public void focusGained(FocusEvent e) {
                selectAll();
            }
        });
           
        this.addCaretListener(new CaretListener() {
            @Override
            public void caretUpdate(CaretEvent e) {
                if (e.getDot() != getText().length() ) {
        			getCaret().setDot(getText().length());
        	}                
            }
        });        
        
    }
    
    private final class FormataQuantidadeDocument extends PlainDocument{
        private static final long serialVersionUID = -3802846632709128803L;
        
        public void insertString(int offs, String str, AttributeSet a) {
            try{
                String original = getText(0,getLength());
                if(original.length() < maxLength){
                    StringBuffer mascara = new StringBuffer();
                    
                    if(a != nullAttribute){                        
                        remove(-1, getLength());                    
                        mascara.append(original+str.replaceAll("[^0-9]", ""));
                        
                        for(int x = 0; x < mascara.length(); x++){
                            if(!Character.isDigit(mascara.charAt(x))){
                                mascara.deleteCharAt(x);
                            }
                        }
                        Long n = new Long(mascara.toString());
                        mascara.replace(0, mascara.length(), n.toString());
                    
                        //verifica casas antes da virgula + a virgula
                        if(mascara.length() < 4){ 
                            if(mascara.length() == 1){                        
                                mascara.insert(0, "00");
                                mascara.insert(0, ","); 
                                mascara.insert(0, "0");                        
                            }else if(mascara.length() == 2){                        
                                mascara.insert(0, "0");
                                mascara.insert(0, ",");                         
                                mascara.insert(0, "0");                        
                            }else if(mascara.length() == 3){                                                
                                mascara.insert(0, ","); 
                                mascara.insert(0, "0");                        
                            }                                 
                        }else{
                            //adiciona virgula
                            mascara.insert(mascara.length()-3, ",");  
                        }
                    
                        if(mascara.length() > 7){                    
                            mascara.insert(mascara.length()-7, ".");
                            if(mascara.length() > 11){
                                mascara.insert(mascara.length()-11, ".");
                                if(mascara.length() > 15){
                                    mascara.insert(mascara.length()-15, ".");
                                }
                            }                    
                        }                    
                        super.insertString(0, mascara.toString(), a);                    
                    }else{
                        if (original.length() == 0){
                            super.insertString(0, "0,000", a);
                        }                    
                    }
                }                
            }catch(Exception e){
                JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
            }
        }
        
        public void remove(int offs, int len) throws BadLocationException{
            if(len == getLength()){
                super.remove(0, len);
                if(offs != -1){
                    insertString(0, "", nullAttribute);                    
                }
            }else{
                String original = getText(0, getLength()).substring(0, offs) + getText(0, getLength()).substring(offs+len);
    		super.remove(0, getLength());
    		insertString(0,original,null);
            }
        }
    }
    
}

Com NetBeans basta usar o “Custom Creation Code” e invocar new JQuantidadeField(int length)…

Eh isso, feliz 2012 pra todos ae.

t+

E por que marcou seu post como off-topic?

Opa Vini, mals ae !!! Affs, acho q tenho no autocomplete aqui.

maus.

t+