Dúvida com JCalendar?

Salve galera.

Estou tentando criar uma classe de configuracao para meus JCalendar, quero fazer isso pq preciso mudar algumas configurações como por exemplo quando o usuario digita uma data válida ela fica em verde e quando esta errada fica em vermelha.
Tentei estender essa classe para JDateChooser mas tbm ainda naum consegui fazer.

estou tentando assim.

public class JCalendarMasks{
    /**
    * Classe de Configuração dos JDateChooser;
    */ 
    private MaskFormatter mascara;
    private JDateChooser jDateChooser;
    
    public JCalendarMasks(JDateChooser component){        
        this.jDateChooser = component;        
        try {            
            this.mascara = new MaskFormatter("##/##/####");
            this.mascara.setPlaceholderCharacter('_');  
            jDateChooser.setIcon(new ImageIcon("/home/fernando/calendar.png"));                    
            final JFormattedTextField formatDate = (JFormattedTextField)jDateChooser.getDateEditor().getUiComponent(); 
            formatDate.setFormatterFactory(new DefaultFormatterFactory(mascara)); 
            formatDate.setHorizontalAlignment(SwingConstants.CENTER);     
            formatDate.setForeground(Color.BLACK);
            
            formatDate.addFocusListener(new FocusListener() {
                @Override
                public void focusGained(FocusEvent e) {
                    formatDate.selectAll(); //nao respeita
                }
                @Override
                public void focusLost(FocusEvent e) {
                    formatDate.setForeground(Color.BLUE); //nao respeita
                }
            });
            
        } catch (ParseException ex) {            
            JOptionPane.showMessageDialog(null, ex.getLocalizedMessage(),"JCalendarMask Error",JOptionPane.ERROR_MESSAGE);
        }
    }    
}


//aqui como uso.
public class FinanConsultaTitulos extends javax.swing.JDialog {

    public FinanConsultaTitulos(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        
        new JCalendarMasks(vencimentoInicial); //invoca a classe passando o componente JDateChooser q esta no JDialog
    }
}
   

Funciona perfeitamente, problema é só esse q disse: Quero customizá-lo para que apenas quando a data for errada mantenha em vermelho e se for verdadeira mantenha em preto e tbm para retornar se a data é valida ou não, pelo visto se encontrar como q a classe trata isso de ficar verde ou vermelho fica facil, mas por enqto ainda não encontrei como fazer.
Dei uma lida nos docs mas msm assim ainda não consegui fazer.

Como fazer isso ?

obrigado.

kra, esta validação que vc diz já é feita pelo jCalendar… só q ele faz digito a digito.

na classe JDateChooser tem um getDateEditor q te retorna a classe que faz isto (JTextFieldDateEditor é a implementação de IDateEditor).

pq vc não baixa o fonte e da uma olhada ?
eu baixei ela e alterei pra trabalhar com LocalDate ao inves de Date. E estava pensando em acertar esta validação de acordo com o que trabalhamos aqui.

[quote=panthovillas]kra, esta validação que vc diz já é feita pelo jCalendar… só q ele faz digito a digito.

na classe JDateChooser tem um getDateEditor q te retorna a classe que faz isto (JTextFieldDateEditor é a implementação de IDateEditor).

pq vc não baixa o fonte e da uma olhada ?
eu baixei ela e alterei pra trabalhar com LocalDate ao inves de Date. E estava pensando em acertar esta validação de acordo com o que trabalhamos aqui.[/quote]

Ja fiz isso, eu sempre baixo o .jar com os sources…Estou tentando implementar aqui, mas como é um componente relativamente antigo pensei em alguém aqui que ja tenha feito isso e q possa dar uma ajuda.

Mas vlw, vou tentar implementar aqui.

obrigado.

[quote=fernandopaiva]Salve galera.

Funciona perfeitamente, problema é só esse q disse: Quero customizá-lo para que apenas quando a data for errada mantenha em vermelho e se for verdadeira mantenha em preto e tbm para retornar se a data é valida ou não, pelo visto se encontrar como q a classe trata isso de ficar verde ou vermelho fica facil, mas por enqto ainda não encontrei como fazer.
Dei uma lida nos docs mas msm assim ainda não consegui fazer.

Como fazer isso ?

obrigado.

[/quote]

Conseguistes fazer fernando?, quero deixar a data em preto sempre, mas nao estou conseguindo…

Para caso de dúvidas, consegui modificar isto,

Como solução:

Fui direto no componente JTextFieldDateEditor dentro do projeto jcalendar

e modifiquei a funcao : caretUpdate,

era assim :

[code]public void caretUpdate(CaretEvent event) {
String text = getText().trim();
String emptyMask = maskPattern.replace(’#’, placeholder);

	if (text.length() == 0 || text.equals(emptyMask)) {
		setForeground(Color.BLACK);
		return;
	}

	try {
		Date date = dateFormatter.parse(getText());
		if (dateUtil.checkDate(date)) {
			setForeground(Color.GREEN);
		} else {
			setForeground(Color.RED);
		}
	} catch (Exception e) {
		setForeground(Color.BLACK);
	}
}[/code]

Ficou assim :

[code]public void caretUpdate(CaretEvent event) {
String text = getText().trim();
String emptyMask = maskPattern.replace(’#’, placeholder);

	if (text.length() == 0 || text.equals(emptyMask)) {
		setForeground(Color.BLACK);
		return;
	}

	try {
		Date date = dateFormatter.parse(getText());
		if (dateUtil.checkDate(date)) {
			setForeground(Color.BLACK);
		} else {
			setForeground(Color.BLACK);
		}
	} catch (Exception e) {
		setForeground(Color.BLACK);
	}
}[/code]

Gerei novamente o .jar e substitui pelo do meu projeto e só :slight_smile:

Espero ter ajudado :wink: