O quem acham dessa abordagem (campo Data com PlainDocument)

0 respostas
javer

Eu até hoje (em uns 8 anos de programação no Swing) nunca vi uma abordagem que "preste" quando se trata de campo data e hora, já fiz várias tentativas de deixar simples e funcional, até agora não fiquei satisfeito com nada.

Segue uma abordagem onde eu adiciono e pego diretamente do Document o valor do campo (JTextField), o que acham disso?
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class DateDocument extends PlainDocument {

    private static int TAMANHO_TEXTO = 10; //para o formato dd/MM/yyyy
    private static String CARACTERES_DATA = "[telefone removido]/";
    private static String FORMATO = "dd/MM/yyyy";

    public DateDocument() {
    }

    public void setDate(Date date) {
        String strr = new java.text.SimpleDateFormat(FORMATO).format(date);
        try {
            remove(0, getLength());
            super.insertString(0, strr, null);
        } catch (BadLocationException ex) {
            Logger.getLogger(DateDocument.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
        //Nao mostrar se a string for null.
        if (str == null) {
            return;
        }

        //Verificar o tamanho maximo permitido
        if (getLength() > TAMANHO_TEXTO) {
            return;
        }

        //Somente para validar os caracteres digitados
        for (int i = 0; i < str.length(); i++) {
            if (CARACTERES_DATA.indexOf(String.valueOf(str.charAt(i))) == -1) {
                java.awt.Toolkit.getDefaultToolkit().beep();
                return;
            }
        }

        //Checar a posicao do caracter que separa a data
        if ((offset == 2) || (offset == 5)) {
            if (!str.equals("/")) {
                return;
            }
        }

        super.insertString(offset, str, attr);
        // inserir o caracter que separa
        if ((offset == 1) || (offset == 4)) {
            super.insertString(offset + 1, "/", attr);
        }

        //If the user has finished entering validate the date entered by him.
        if (offset == TAMANHO_TEXTO - 1) {
            String strr = getText(0, getLength());
            remove(0, getLength());
            super.insertString(0, getCorrectDate(strr), attr);
        }
    }

    private String getCorrectDate(String oldDate) {
        String newDate = "";
        java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat(FORMATO);
        try {
            java.util.Date date1 = formatter.parse(oldDate);
            newDate = formatter.format(date1);
        } catch (java.text.ParseException ex) {
            Logger.getLogger(DateDocument.class.getName()).log(Level.SEVERE, null, ex);
            newDate = "";
        }
        return newDate;
    }

    public Date getDate() {
        Date newDate = null;
        java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat(FORMATO);
        try {
            newDate = formatter.parse(this.getText(0, TAMANHO_TEXTO));
        } catch (java.text.ParseException ex) {
            //Logger.getLogger(DateDocument.class.getName()).log(Level.SEVERE, null, ex);
        } catch (BadLocationException ex) {
            //Logger.getLogger(DateDocument.class.getName()).log(Level.SEVERE, null, ex);
        }
        return newDate;
    }
}
Setando o valor no campo:
SwingUtilities.invokeLater(new Runnable()                         {
            
            @Override
            public void run() {
                ((DateDocument) campoDataEmissao.getDocument()).setDate(new Date());
                ((DateDocument) campoHoraEmissao.getDocument()).setDate(new Date());
            }
        });
Pegando o valor no campo:
Date data = ((DateDocument) campoDataEmissao.getDocument()).getDate();
        System.out.println("data: " + data);

De repente alguém tem algo a adicionar, sei lá.

Criado 12 de janeiro de 2011
Respostas 0
Participantes 1