JTextFields e Document Complexo

5 respostas
Ironlynx
Eu preciso das features da classe PlainDocument, e da interface DocumentListener, mas ao combiná-las, dá merda.Os atributos de plaindocument nunca funcionam.No caso, é permitir somente uma dada formatação, exemplo:
private class FracaoIdealListener extends PlainDocument implements DocumentListener{
   	 private JTextField aue;
   	 private JTextField ate;
   	 public static final int NUMERO_DIGITOS_MAXIMO = 12;  	
   	   	
   	public FracaoIdealListener(JTextField aue,JTextField ate){
   		this.aue=aue;
   		this.ate=ate;   		
   	}
   	
   	public void changedUpdate(DocumentEvent e) {   
            /*Do nothing*/   
    }   
    public void insertUpdate(DocumentEvent e) { 
       	if(aue.getText()!=null&&ate.getText()!=null){ 
       		Double edificada=Double.parseDouble(f.convertToBigDecimalFormat(aue.getText()));
            Double total=Double.parseDouble(f.convertToBigDecimalFormat(ate.getText()));
            if(total>edificada){
            	JOptionPane.showMessageDialog(null,"Atenção!Tem que haver mais de uma unidade no FCnul");
            }else{
              new Thread( new Runnable() {
                   public void run() {
                     String fracao=f.atualizarFracaoIdeal2(areaEdField.getText(),areaTotField.getText());
                         fracaoIdeal.setText(fracao);
                                     }
                          } ).start();             	
            }	                          	       	 
    	}else{
    	fracaoIdeal.setText("1.00");   	 
    	}	              
    }//fim do insert update   
    public void removeUpdate(DocumentEvent e) {  
    	String s = aue.getText();
    	if(s.length()<1)
           fracaoIdeal.setText("1.00");            
    }
    
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {

  String texto = getText(0, getLength());

  for (int i = 0; i < str.length(); i++) {
      char c = str.charAt(i);
      if (!Character.isDigit(c)) {
          return;
      }
  }

   if(texto.length() < this.NUMERO_DIGITOS_MAXIMO){
          super.remove(0, getLength()); 
      texto = texto.replace(".", "").replace(",", "");
      StringBuffer s = new StringBuffer(texto + str);

   if (s.length() > 0 && s.charAt(0) == '0') {
       s.deleteCharAt(0);
   }

   if(s.length() < 3) {
     if (s.length() < 1) { 
         s.insert(0,"000");
     }else if (s.length() < 2) {
         s.insert(0,"00");
   }else{
    s.insert(0,"0");
    }
   } 

  s.insert(s.length()-2, ",");

  if(s.length() > 6) {
    s.insert(s.length()-6, ".");
  }

  if(s.length() > 10) {
    s.insert(s.length()-10, ".");
  }

  super.insertString(0, s.toString(), a);
  }
  }

  public void remove(int offset, int length) throws BadLocationException {
    super.remove(offset, length); 
      String texto = getText(0, getLength());
      texto = texto.replace(",", "");
      texto = texto.replace(".", "");
    super.remove(0, getLength());
    insertString(0, texto, null);
  }         	
 }//fim da classe privada FracaoIdealListener
Isoladamente, a formatação funciona, e a interação entre os TextFields tb, mas juntos(que é o que eu preciso), dá problema.Alguém já passou por algo parecido. :roll:

5 Respostas

Ironlynx

Hum…ando fazendo uns testes aqui não daria para usar os dois pq ambos ocupam a vaga de Document… alguém conhece uma forma de deixar um TextField formatado para números (por exemplo:1.250,50) que NÃO use PlainDocument nem JFormatterTextField?

Ironlynx

Bom, depois de 178901234 testes(na verdade foram uns 30… :lol:), descobri que:
Maskformatter não me atende(o tamanho não flexbiliza bem), e parece “pesado” em máquinas antigas.
Não dá para substituir o DocumentListener como opção para os JtextFields dinâmicos.Dessa forma é a única que eles trablham 100% e sem erros.Estou terminando os testes com InputVerifier(usando DecimalFormat), e parece que ele será a única opção de formatação e manter o dinamismo ao mesmo tempo.

root_

Ironlynx, estou com um problema q é o seguinte…
Criei um TextFieldMonetario e quero utiliza-lo em um jTable…
Criei tb meus CellRenderer e CellEditor, para q quando terminar a edição do valor, aparecer a formatação do Currency.
O problema é que, quando clico na célula para modificar o valor, ela fica LIMPA…
Nesse link abaixo estão as classes… rode para entender melhor o problema, e se puder, dê seu palpite.

http://www.dataview.com.br/TESTES.zip

Soh fazer o DL e rodar a classe ParseText2.

xD

Ironlynx

root, eu tô com um prazo apertado aqui, e não dá para testar o projeto, poste com as tags code o seu controle de foco na sua JTable.

root_

no link tao soh as classes q utilizo e um exemplo mesmo… soh executar o ParseText2.
Creio que você vai se interessar por essa solução de mascaramento de valor monetário bem como de edição com auto-completar de casas de milhar e decimal.

Criado 29 de outubro de 2007
Ultima resposta 18 de jun. de 2008
Respostas 5
Participantes 2