JMoney com 3 casas decimais

5 respostas
marciofermino

Amigos estou usando este método para inserir valores formatados…

esta funcionando mais eu preciso agora de 3 casas decimais e não consegui
implentar…

Se alguém puder ajudar agradeço;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Public;


import java.awt.event.FocusAdapter;   
import java.awt.event.FocusEvent;   
  
import javax.swing.JFormattedTextField;   
import javax.swing.JTextField;   
import javax.swing.event.CaretEvent;   
import javax.swing.event.CaretListener;   
import javax.swing.text.AttributeSet;   
import javax.swing.text.BadLocationException;   
import javax.swing.text.PlainDocument;   
import javax.swing.text.SimpleAttributeSet;   

 
/**  
* Component JMoneyField  
* @author Dyorgio da Silva Nascimento  
*/   
public class JMoneyField extends JFormattedTextField {   
       
    private static final long serialVersionUID = -5712106034509737967L;   
    private static final SimpleAttributeSet nullAttribute = new SimpleAttributeSet();   
       
    /**  
     * Creates a new instance of JMoneyField  
     */   
    public JMoneyField() {   
        this.setHorizontalAlignment( JTextField.CENTER );   
        this.setDocument(new MoneyFieldDocument());   
        this.addFocusListener(new MoneyFieldFocusListener());   
        this.setText("0,00");   
        this.addCaretListener(new CaretListener(){   
            public void caretUpdate(CaretEvent e) {   
                if (e.getDot() != getText().length() ) {   
                    getCaret().setDot(getText().length());   
                }   
            }   
        });   
    }   
       
    private final class MoneyFieldFocusListener extends FocusAdapter{   
        public void focusGained(FocusEvent e) {   
            selectAll();   
        }   
    }   
       
    private final class MoneyFieldDocument extends PlainDocument {   
           
        /**  
         *  
         */   
        private static final long serialVersionUID = -3802846632709128803L;   
  
        public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {   
            String original = getText(0,getLength());   
               
            // Permite apenas digitar até 16 caracteres (9.999.999.999,99)   
            if (original.length()<16) {   
                StringBuffer mascarado = new StringBuffer();   
                if (a != nullAttribute) {   
                    //limpa o campo   
                    remove(-1,getLength());   
                       
                    mascarado.append((original+str).replaceAll("[^0-9]",""));   
                    for (int i = 0; i < mascarado.length(); i++){   
                        if (!Character.isDigit(mascarado.charAt(i))){   
                            mascarado.deleteCharAt(i);   
                        }   
                    }   
                    Long number = new Long(mascarado.toString());   
                       
                    mascarado.replace(0, mascarado.length(), number.toString());   
                       
                    if ( mascarado.length() < 3 )   
                    {   
                        if ( mascarado.length() == 1 ) {   
                            mascarado.insert(0,"0");   
                            mascarado.insert(0,",");   
                            mascarado.insert(0,"0");   
                        }else if ( mascarado.length() == 2 ) {   
                            mascarado.insert(0,",");   
                            mascarado.insert(0,"0");   
                        }   
                    }else{   
                        mascarado.insert(mascarado.length()-2,",");   
                    }   
                       
                    if ( mascarado.length() > 6 ) {   
                        mascarado.insert(mascarado.length()-6, '.');   
                        if (mascarado.length() > 10 ) {   
                            mascarado.insert(mascarado.length()-10, '.');   
                            if (mascarado.length() > 14 ) {   
                                mascarado.insert(mascarado.length()-14, '.');   
                            }   
                        }   
                    }   
                    super.insertString(0, mascarado.toString(), a);   
                }else{   
                    if (original.length() == 0){   
                        super.insertString(0, "0,00", a);   
                    }   
                }   
            }   
        }   
           
        @Override   
        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);   
            }   
        }   
    }   
}

5 Respostas

A

package util.swing;

import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;

import javax.swing.JFormattedTextField;

import javax.swing.JTextField;

import javax.swing.event.CaretEvent;

import javax.swing.event.CaretListener;

import javax.swing.text.AttributeSet;

import javax.swing.text.BadLocationException;

import javax.swing.text.PlainDocument;

import javax.swing.text.SimpleAttributeSet;

/**

  • Component JDoubleField
    */
    public class DoubleField extends JFormattedTextField {

    private static final long serialVersionUID = -5712106034509737967L;
    private static final SimpleAttributeSet nullAttribute = new SimpleAttributeSet();

    /**

    • Creates a new instance of JDoubleField
      */
      public DoubleField() {
      this.setHorizontalAlignment( JTextField.CENTER );
      this.setDocument(new DoubleFieldDocument());
      this.addFocusListener(new DoubleFieldFocusListener());
      this.setText(“0,000”);
      this.addCaretListener(new CaretListener(){
      public void caretUpdate(CaretEvent e) {
      if (e.getDot() != getText().length() ) {
      getCaret().setDot(getText().length());
      }
      }
      });
      }
    private final class DoubleFieldFocusListener extends FocusAdapter{
    
    public void focusGained(FocusEvent e) {
    
    selectAll();
    
    }
    
    }
    

    private final class DoubleFieldDocument extends PlainDocument {

    /** 
       *  
       */  
      private static final long serialVersionUID = -3802846632709128803L;  
    
      public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {  
          String original = getText(0,getLength());  
            
          // Permite apenas digitar at&#65533; 16 caracteres (99.999,999)  
          if (original.length()< 10) {  
              StringBuffer mascarado = new StringBuffer();  
              if (a != nullAttribute) {  
                  //limpa o campo  
                  remove(-1,getLength());  
                    
                  mascarado.append((original+str).replaceAll("[^0-9]",""));  
                  for (int i = 0; i < mascarado.length(); i++){  
                      if (!Character.isDigit(mascarado.charAt(i))){  
                          mascarado.deleteCharAt(i);  
                      }  
                  }  
                  Long number = new Long(mascarado.toString());  
                    
                  mascarado.replace(0, mascarado.length(), number.toString());  
                          
                  if ( mascarado.length() < 4 )  
                  {  
                      if ( mascarado.length() == 1 ) {  
                          mascarado.insert(0,"0");  
                          mascarado.insert(0,"0");  
                          mascarado.insert(0,",");  
                          mascarado.insert(0,"0");  
                      }else if ( mascarado.length() == 2 ) {  
                          mascarado.insert(0,"0");  
                          mascarado.insert(0,",");  
                          mascarado.insert(0,"0");  
                      }else if (mascarado.length() == 3){
                          mascarado.insert(0,",");  
                          mascarado.insert(0,"0");                              
                      }  
                  }else{  
                      mascarado.insert(mascarado.length()-3,",");  
                  }  
                    
                  if ( mascarado.length() > 7 ) {  
                      mascarado.insert(mascarado.length()-7, '.');  
                      if (mascarado.length() > 11 ) {  
                          mascarado.insert(mascarado.length()-11, '.');  
                          if (mascarado.length() > 15 ) {  
                              mascarado.insert(mascarado.length()-15, '.');  
                          }  
                      }  
                  }  
                  super.insertString(0, mascarado.toString(), a);  
              }else{  
                  if (original.length() == 0){  
                      super.insertString(0, "0,000", a);  
                  }  
              }  
          }  
      }  
        
      @Override  
      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);  
          }  
      }
    

    }
    }

Andre_Brito

Opa!

Você tem que usar MaskFormatter (com a máscara “#.###”, se você quiser algo do tipo 2.123. Se quiser um valor que possa variar no lado esquerdo da vírgula, acho que deve usar “?#.###”, mas não tenho certeza).

Veja um exemplo nesse link.

Abraço e próspero Ano Novo.

marciofermino

bem ok… ate ai eu sei

so que com essa classe quando eu arrasto para o formulario
no netbeans… eu consigo que a fortamacao moeda seja executada enquanto o
usuario digita…

Andre_Brito

O MaskFormatter lida com isso.
Ele já aparece a “,” ou “.” antes mesmo de o usuário digitar. Conforme ele vai digitando, os números vão sendo arrumados.
Como usuário é usuário, então é sempre bom colocar mais algumas dicas, como ToolTipText ou um JLabel menor abaixo do campo, pra ele saber como deve digitar.

Abraço.

marciofermino

opa valeu

Criado 23 de dezembro de 2008
Ultima resposta 4 de jan. de 2009
Respostas 5
Participantes 3