Data, apenas numeros e JTextField

Opa…
Minha divida eh o seguinte:

Preciso ter um campo para ler uma data, ex: dd/mm/aaaa e tambem de um JtextField que aceite apenas numeros.

:arrow: Como fazer para que um JTextField fico por exemplo com um formato assim: … /…/…
sou seja… ja fica aparentemente mostrando que eh um campo de data, ae o cara escreve primeiro o dia ja pula para mes… etc…

:arrow: E como limitar um JTextField para que aceite apenas numero??? Faço isso com KeyListener?? Com setDocument( new MeuPlainDocument() ) ) …???

alguem tem alguma sugestão melhor para esse tipo de coisa
Obrigado.

Dá uma olhada da class JFormattedTextField:

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JFormattedTextField.html

E tbem na classe MaskFormatter:

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/text/MaskFormatter.html

[quote=“leonardom”]Dá uma olhada da class JFormattedTextField:

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JFormattedTextField.html

E tbem na classe MaskFormatter:

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/text/MaskFormatter.html[/quote]

Qual a diferenca em usar mascara ou Document???
Parecem ser bem parecidos…

[quote=“Hempx”]
Qual a diferenca em usar mascara ou Document???
Parecem ser bem parecidos…[/quote]

Só que com Document você tem que fazer todo o tratamento, enquanto com as classes JFormattedTextField e MaskFormatter já fazem isso por você.

Tem como eu “setar” um MaskFormatter para o JFormattedTextField depois que ele foi criado?

ex:

JFormattedTextField j1 = new JFormattedTextField();
j1.setFormatter( new MaskFormatter("###.##") );

Tem como?

[quote=“danieldestro”]Tem como eu “setar” um MaskFormatter para o JFormattedTextField depois que ele foi criado?

ex:

JFormattedTextField j1 = new JFormattedTextField();
j1.setFormatter( new MaskFormatter("###.##") );

Tem como?[/quote]

Daniel tem sim, é só usar o método install da classe MaskFormatter.

JFormattedTextField j1 = new JFormattedTextField();
new MaskFormatter("###.##").install( j1 );

Na verdade o que eu quero é que meu campo (JFormattedTextField) tenha a seguinte máscara: //____, e se possível apenas receba uma dáta válida, segundo a máscara passada (ex: dd/MM/yyyy).

Algum código de exemplo? To apanhando aqui.

Creio que tem que usar o PlainDocument, né? Isso não seria arrumado no jdk 1.4.2?

É Daniel a máscara não seria problema, mas a validação vc tem que desenlvolver. No MaskFormat tem apenas como vc configurar para aceitar somente números, mas para validar tem que ser na unha. Agora se isso seria arrumado numa futura versão, só os deuses sabem, vamos torcer que sim.

Mas esse JFormattedTextField é MUITO chato…
eu coloquei a máscara SimpleDateFormat(“dd/MM/yyyy”), e quando eu digito ele não aparece a máscara no campo e quando o formato é inválido ou a data some ou ele coloca outra… WEIRDDD :frowning:

Um JTextField customizado que só aceita numeros

[code]
/*
*

  • Tipo: JNumberField
    */

import javax.swing.;
import javax.swing.text.
;
import java.awt.Toolkit;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;

/**

  • JTextField personalizado permitindo somente números.
    */
    public class JNumberField extends JTextField
    {
    private Toolkit toolkit;
    private NumberFormat integerFormatter;
    private int maxDigits;

    /**

    • Constrói um novo JNumberField com máximo de caracteres igual a maxNoDigits.
    • @param maxNoDigits Um inteiro contendo o número máximo de caracteres do campo.
      */
      public JNumberField(int maxNoDigits)
      {
      super(4);
      toolkit = Toolkit.getDefaultToolkit();
      integerFormatter = NumberFormat.getNumberInstance(Locale.US);
      integerFormatter.setParseIntegerOnly(true);
      if(maxNoDigits<1)
      {
      maxDigits=99;
      }
      else
      {
      maxDigits=maxNoDigits;
      }
      }

    /**

    • Construtor, Constrói um novo JNumberField com tamanho máximo de 99.
      */
      public JNumberField()
      {
      super(4);
      toolkit = Toolkit.getDefaultToolkit();
      integerFormatter = NumberFormat.getNumberInstance(Locale.US);
      integerFormatter.setParseIntegerOnly(true);
      maxDigits=99;
      }

    /**

    • Retorna o comprimento do JNumberField.
    • @return Um inteiro contendo o total de caracteres no campo.
      */
      public int getlength()
      {
      String fieldValue=getText();
      return (fieldValue.length());
      }

    /**

    • Retorna o valor do JNumberField.
    • @return Um inteiro contendo o texto do campo.
      */
      public int getValue()
      {
      int retVal = 0;
      try
      {
      retVal = integerFormatter.parse(getText()).intValue();
      } catch (ParseException e)
      {
      // Isto nunca deveria acontecer porque insertString permite
      // apenas dados propriamente formatados para inserir no JNumberField.
      toolkit.beep();
      }
      return retVal;
      }

    /**

    • Seta o valor passado no JNumberField.
    • @param value Um inteiro contendo o valor a ser escrito no campo.
      */
      public void setValue(int value)
      {
      setText(integerFormatter.format(value));
      }

    /**

    • Seta o número máximo de caracteres no JNumberField.
    • @param value um inteiro contendo a capacidade máxima do campo.
      */
      public void setMaxDigits(int value)
      {
      if(value>0)
      {
      maxDigits=value;
      }
      }

    /**

    • Retorna o número máximo de caracteres no JNumberField.
    • @return Um inteiro contendo o máximo de caracteres suportado pelo campo.
      */
      public int getMaxDigits()
      {
      return maxDigits;
      }

    /**

    • Limpa o JNumberField.
      */
      public void clearField()
      {
      setText("");
      }

    /**

    • Cria um novo documento padrão para o campo.
    • @return Um documento novo que será aplicado no componente.
      */
      protected Document createDefaultModel()
      {
      return new WholeNumberDocument();
      }

    protected class WholeNumberDocument extends PlainDocument
    {
    /**
    * Insere o texto digitado no campo, conforme ele é digitado.
    * Caso um caracter não permitido seja digitado, não é exibido.
    *
    * @param offs Um inteiro contendo a capacidade do campo.
    * @param str Uma String contendo o texto a ser inserido no campo.
    * @param a Um AttributeSet contendo os atributos.
    */
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException
    {
    char[] source = str.toCharArray();
    char[] result = new char[source.length];
    int j = 0;

      	for &#40;int i = 0; i &lt; result.length; i++&#41;
      	&#123;
      		//impede a quebra de linha de ser mostrada no campo.
      		if &#40;&#40;Character.isWhitespace&#40;source&#91;i&#93;&#41; || Character.isDigit&#40;source&#91;i&#93;&#41;&#41;&amp;&amp;&#40;offs&lt;&#40;maxDigits&#41;&#41; &amp;&amp; &#40;int&#41;source&#91;i&#93; != 10&#41;
      			result&#91;j++&#93; = source&#91;i&#93;;
      		else 
      			toolkit.beep&#40;&#41;;
      	&#125;
      	super.insertString&#40;offs, new String&#40;result, 0, j&#41;, a&#41;;
      &#125;
    

    }
    }[/code]

Obrigado, bem legal.
mas ninguem tem nada usando JFormattedTextField>>>

Cara, faz uma busca aqui no GUJ por FixedLengthDocument (ou variações) e PlainDocument.

Vc pode colocar uma máscara no seu JFormattedTextField e associar a ele um Document que só aceita números e que automaticamente tem nas posições 3 e 6 as barrinhas…

eu não disse que seria divertido… : ))))

[]s!

private JFormattedTextField TDtNascto;

try {
MaskFormatter format = new MaskFormatter("##/##/####");
TDtNascto = new JFormattedTextField(format);
TDtNascto.setBounds(110,80,80,20);
this.getContentPane().add(TDtNascto);
}
catch(Exception ex)
{}

caso resolvido no seguinte forum:

http://www.guj.com.br/java/216843-inserir-barra-automaticamente-no-campo-data