jFormattedField não consegue segurar o valor

Salve salve galera… :slight_smile:
Seguinte to com um problema muuuito louco…
é o seguinte: tenho um form (em uma aplicação desktop), é um cadastro simples, possui os campos de Id, descricao e preco. Nos campos Id e descricao estou utilizando jTextField e no campo de preco to usando um jFormattedTextField pq quero que fique com a máscara já que no banco será gravado como float.
Só que ai quando rodo o programa e coloco o valor no campo preco ele some…tipo ai quando vou salvar ele diz que o campo esta nullo (o campo ja esta vinculado com o objeto que grava no banco) ai eu testei o seguinte: coloquei um JOPtionPane pra ver o valor e é nullo, ai coloquei um campo jTextField normal e vinculei no mesmo objeto que o jFormattedTextField e ai ele grava, mas porém fica sem a máscara…e o pior…se eu deixar os 02 campos no form o campo da máscara assume o valor do txtField normal acho q isso é pq o jTextField consegue pegar o valor e o campo com a máscara não…
Ai ta a duvida: Porque meu campo jFormattedTextField não consegue salvar o valor???

vlw gente!!!

O valor que você está jogando no JFormattedTextField é perfeitamente adequado à máscara de edição do componente? Outro ponto de atenção: você atribuiu algum valor à propriedade FocusLostBehavior? Caso não o tenha feito, sugiro tentar usar o valor JFormattedTextField.PERSIST.

http://java.sun.com/javase/6/docs/api/javax/swing/JFormattedTextField.html#setFocusLostBehavior(int)

Oi roger_rf…seguinte meu dado é float e ai estou usando a máscara de currenty default (¤ #,##0.00) pra ficar em moeda…tentei com outras máscaras e não funcionou…tipo eu quero que o valor fiquei no formato 000.00 ou 0.000.00, entendeu?Será que é isso?Mas eu ja testei vários tipos de máscaras…

Tentei mudar a propriedade pra PERSIST como vc me falou…ai quando eu tiro o foco do campo ele não perde o valor digitado…mas ai a máscara nao é aplicada e o valor não é inserido no banco…o que pode ser agora???Estou usando a mascara currenty default

Obrigado pela ajuda!!Mas será que vc pode me ajudar + uma vez??

Eu, pessoalmente, prefiro não usar o JFormattedTextField para editar valores decimais, acho melhor usar um JTextField com um Document especializado. Seguem as classes que uso:

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

// PlainDocument com limitação ao número máximo de caracteres armazenados.
// Valores de limite menores ou iguais a zero indicam que não haverá
// limitações ao número de caracteres.

public class FixedSizePlainDocument extends PlainDocument {
  private int maximumSize = 0;

  public FixedSizePlainDocument(int maximumSize) {
    this.maximumSize = maximumSize;
  }

  public FixedSizePlainDocument() {
    this(0);
  }

  public int getMaximumSize() {
    return maximumSize;
  }

  public void setMaximumSize(int maximumSize) {
    this.maximumSize = maximumSize;
  }

  @Override
  public void insertString(int offset, String str, AttributeSet attr)
      throws BadLocationException {
    // Evita strings nulas ou vazias
    if ((str == null) ||
        (str.length() < 1)) {
      return;
    }

    // Só faz checagem de tamanho se o limite for maior do que zero
    if (maximumSize > 0) {
      // Se o texto atual já chegou ao limite, sai
      int curSize = this.getLength();

      if (curSize >= maximumSize) {
        return;
      }

      // Se a soma do comprimento atual do texto com o comprimento do
      // trecho a ser inserido superar o limite ajustado, trunca o
      // trecho a inserir para respeitar o limite
      int strSize = str.length();
      int sumSize = curSize + strSize;

      if (sumSize > maximumSize) {
        int lastPosition = Math.min(strSize, strSize - (sumSize - maximumSize));

        if (lastPosition >= 0) {
          str = str.substring(0, lastPosition);
        }
      }
    }

    // Insere a string
    super.insertString(offset, str, attr);
  }
}
// PlainDocument especializado para edição de números decimais.

public class DecimalNumberPlainDocument extends FixedSizePlainDocument {
  private char decimalSeparator = ',';

  public DecimalNumberPlainDocument(int maximumSize) {
    super(maximumSize);

    // Busca o separador decimal padrão
    decimalSeparator = new DecimalFormat().getDecimalFormatSymbols()
      .getDecimalSeparator();
  }

  public DecimalNumberPlainDocument() {
    this(0);
  }

  @Override
  public void insertString(int offset, String str, AttributeSet attr)
      throws BadLocationException {
    // Evita strings nulas ou vazias
    if ((str == null) ||
        (str.length() < 1)) {
      return;
    }

    // Checa o primeiro caractere para saber se a string digitada
    // é numérica ou alfabética. Normalmente isso é suficiente para
    // nossas checagens, pois o mais comum é que esta rotina só receba
    // um caractere por chamada. Porém, se <str> tiver comprimento
    // maior do que 1 (por exemplo, ao colar texto com Ctrl+V), a
    // seqüência gerada pela concatenação da string atual do documento
    // com a nova string pode gerar um valor inválido. Dessa forma, é
    // imprescindível validar posteriormente a string resultante quando
    // chegar a hora de convertê-la para número
    char c = str.charAt(0);

    switch (c) {
      // Caracteres numéricos
      case '0': case '1': case '2':
      case '3': case '4': case '5':
      case '6': case '7': case '8':
      case '9':
        // ... Nada a fazer ...
        break;

      // Separadores decimais, sinal de menos (-) e demais caracteres
      default:
        if ((c == '.') ||
            (c == ',') ||
            (c == decimalSeparator)) {  // Separadores decimais
          int curSize = this.getLength();

          if (curSize > 0) {
            // Se a string atual no documento já contiver um separador
            // decimal, sai da rotina
            String txt = this.getText(0, curSize);

            if (txt.indexOf(String.valueOf(decimalSeparator)) != -1) {
              return;
            }
          }

          // Força que a string digitada seja o separador decimal padrão
          str = String.valueOf(decimalSeparator);
        } else if (c == '-') {  // Sinal de menos (-)
          int curSize = this.getLength();

          if (curSize > 0) {
            // Se a string atual no documento já contiver um sinal de
            // menos, sai da rotina
            String txt = this.getText(0, curSize);

            if (txt.indexOf(String.valueOf(c)) != -1) {
              return;
            }
          }
        }
        else  {  // Demais caracteres
          // Sai da rotina
          return;
        }

        break;
    }

    // Insere a string
    super.insertString(offset, str, attr);
  }
}

Para aplicar o Document especializado ao JTextField, pode-se usar código como o que segue:

Obrigado roger_rf, vou tentar fazer esta classe que vc tem ai tentar colocar no meu projeto…
Depois post a resposta de deu certo

ObrigadoO :lol:

Oii roger_rf, obrigado pela ajuda…sabe qndo voce falou sobre essas classes, ai fui olhar aqui e tenho uma classe de conversões com várias conversões de String para outros valores…ai troquei o jFormattedtextField pelo txtField e peguei um método de lá e chamei dentro do método de teste de validação dos campos, o código ficou assim:

 if((obj.getPreco() == null) || (obj.getPreco() <=1)){
            Dialogos.mensagemErro("O preço do serviço deve ser informado");
            txtPreco.requestFocus();
            return false;
        }else{
            try {
                Conversoes.stringToFloat(txtPreco.getText());
            } catch (ParseException ex) {
                Dialogos.mensagemErro("O preço deve ser válido."+ ex.getMessage());
            }
        }

Então resolvi meu problema!!
Valeu roger_rf!!!