Pular para o conteúdo
CrossFly é 100% open sourceSiga no GitHub
CrossFlyCrossFly
Começar

DatePicker

DatePicker seleciona uma data num calendário mensal, com navegação por mês, por ano e grades de seleção rápida de mês/ano. Segue o padrão dos pickers: devolve o valor via getAnswer() consumido por show(onAnswer) ao fechar (ver Picker).

🟡 · Pacote: dev.crossfly.ui.picker · Estende: Picker · Estilo: DatePickerStyle

Quando usar

  • Coletar uma data (aniversário, agendamento, vencimento) com UI de calendário.

Quando NÃO usar

Aparência

Cartão com barra de título, linha de mês (< Nome >), linha de ano (< 2026 >) e uma grade de 6×7 células de dias. Dimensiona-se em ~90% de Screen.minSize.

Exemplo completo (copiar, colar e rodar)

package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.picker.*;

/** Tela principal executável. Aponte o launcher (classname) e rode: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      Button abrir = new Button("Escolher data");
      abrir.onAction(c ->
      {
         DatePicker dp = new DatePicker().title("Data de nascimento");
         dp.show(answer -> Hint.show("Data: " + (String) answer, 2000));
      });
      add(LAY_AUTO, abrir);
   }
}

Os trechos abaixo mostram só o miolo (o que vai dentro de onShow()). Para rodar, coloque-os no esqueleto MainWindow acima.

Uso básico

DatePicker dp = new DatePicker();
dp.show(answer -> campoData.setText((String) answer));

Construtores

Construtor Descrição
DatePicker() Sem parâmetros; inicia na data de hoje.

Propriedades e personalização (fluentes)

Método Tipo Default O que faz
setDate(int year, int month, int day) ano, mês 0-based, dia 1-based hoje Pré-seleciona a data.
title(String) String "Date Picker" Texto da barra de título.
yearRange(int before, int after) int, int 30, 10 Anos antes/depois para a grade de anos.
style(DatePickerStyle) estilo skin Estilo customizado.
getSelectedDay() int — Dia selecionado (1-based).
getDisplayYear() / getDisplayMonth() int — Ano / mês exibidos (mês 0-based).

Callbacks e eventos

Callback Quando dispara
onSelect(Action) ao tocar num dia (recebe o próprio DatePicker).
show(onAnswer) ao fechar, entrega a String da data (se confirmada).

getAnswer() retorna a data no formato de DateTimeUtils.formatDate — a ordem (DMY/MDY/YMD) e o separador dependem de LocaleFormats, não é fixo dd/MM/yyyy.

Estados

  • Navegar entre meses zera selectedDay para -1 (nenhum dia marcado até o usuário escolher).
  • Estilos por estado: hoje, selecionado, outro mês, normal (via DatePickerStyle).

Data de nascimento

DatePicker dp = new DatePicker()
   .title("Data de nascimento")
   .yearRange(100, 0)     // até 100 anos atrás, nenhum no futuro
   .setDate(2000, 0, 1);  // 01/Jan/2000 (mês 0-based!)

dp.onSelect(p ->
{
   DatePicker d = (DatePicker) p;
   Debug.log("dia=" + d.getSelectedDay() + " mes=" + (d.getDisplayMonth() + 1));
});

dp.show(answer ->
{
   String data = (String) answer; // ex.: "01/01/2000" conforme LocaleFormats
   campoData.setText(data);
});

Boas práticas

  • Lembre que month é 0-based em setDate.
  • Para localizar nomes de meses/dias, reatribua as constantes públicas MONTH_NAMES/MONTH_SHORT.

Erros comuns

  • Passar mês 1-based em setDate — janeiro é 0.
  • Esperar formato fixo — a saída segue LocaleFormats.dateFormat/dateSeparator.
  • yearRange como clamp de seleção — ele só limita a navegação de anos; qualquer dia do mês exibido é selecionável.

Veja também

Esta página foi útil?