# DatePicker

> मासिक कैलेंडर में तारीख का चयन — वैकल्पिक अनुमत सीमा के साथ, और चुना गया दिन वापस मिलता है।

Source: https://crossfly.dev/hi/docs/ui/widgets/datepicker — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# DatePicker

`DatePicker` एक मासिक कैलेंडर में **तारीख** चुनता है, महीने और वर्ष के नेविगेशन तथा महीने/वर्ष के त्वरित चयन ग्रिड के साथ। यह पिकर पैटर्न का अनुसरण करता है: बंद होने पर `show(onAnswer)` द्वारा उपभोग किए गए `getAnswer()` के माध्यम से मान लौटाता है (देखें [`Picker`](/docs/ui/widgets/picker))।

> 🟡 · **पैकेज:** `dev.crossfly.ui.picker` · **विस्तार करता है:** `Picker` · **शैली:** `DatePickerStyle`

## कब उपयोग करें
- कैलेंडर UI के साथ एक तारीख एकत्र करना (जन्मदिन, शेड्यूलिंग, नियत तिथि)।

## कब उपयोग न करें
- समय एकत्र करना → [`TimePicker`](/docs/ui/widgets/timepicker) का उपयोग करें।

## दिखावट
शीर्षक पट्टी, महीने की पंक्ति (`< Nome >`), वर्ष की पंक्ति (`< 2026 >`) और दिनों की 6×7 कोशिकाओं की एक ग्रिड वाला कार्ड। इसका आकार `Screen.minSize` के ~90% पर होता है।

## संपूर्ण उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)
```java
package com.exemplo;

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

/** चलाने योग्य मुख्य स्क्रीन। launcher (classname) की ओर संकेत करें और चलाएँ: 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);
   }
}
```

> नीचे दिए गए स्निपेट **केवल मूल भाग** दिखाते हैं (जो `onShow()` के अंदर जाता है)। चलाने के लिए, इन्हें ऊपर दिए `MainWindow` कंकाल में रखें।

## बुनियादी उपयोग
```java
DatePicker dp = new DatePicker();
dp.show(answer -> campoData.setText((String) answer));
```

## कंस्ट्रक्टर
| कंस्ट्रक्टर | विवरण |
|---|---|
| `DatePicker()` | बिना पैरामीटर; आज की तारीख से शुरू होता है। |

## गुण और अनुकूलन (fluent)
| मेथड | प्रकार | डिफ़ॉल्ट | क्या करता है |
|---|---|---|---|
| `setDate(int year, int month, int day)` | वर्ष, महीना **0-आधारित**, दिन 1-आधारित | आज | तारीख पूर्व-चयनित करता है। |
| `title(String)` | `String` | `"Date Picker"` | शीर्षक पट्टी का टेक्स्ट। |
| `yearRange(int before, int after)` | `int`, `int` | 30, 10 | वर्ष ग्रिड के लिए पहले/बाद के वर्ष। |
| `style(DatePickerStyle)` | शैली | skin | कस्टम शैली। |
| `getSelectedDay()` | `int` | — | चयनित दिन (1-आधारित)। |
| `getDisplayYear()` / `getDisplayMonth()` | `int` | — | प्रदर्शित वर्ष / महीना (महीना 0-आधारित)। |

## कॉलबैक और इवेंट
| कॉलबैक | कब ट्रिगर होता है |
|---|---|
| `onSelect(Action)` | किसी दिन को टैप करने पर (स्वयं `DatePicker` प्राप्त करता है)। |
| `show(onAnswer)` | बंद होने पर, तारीख की `String` देता है (यदि पुष्टि की गई हो)। |

`getAnswer()` तारीख को `DateTimeUtils.formatDate` के फ़ॉर्मेट में लौटाता है — **क्रम (DMY/MDY/YMD) और विभाजक `LocaleFormats` पर निर्भर करते हैं**, यह निश्चित `dd/MM/yyyy` नहीं है।

## अवस्थाएँ
- महीनों के बीच नेविगेट करने से `selectedDay` `-1` पर रीसेट हो जाता है (जब तक उपयोगकर्ता न चुने, कोई दिन चिह्नित नहीं होता)।
- अवस्था के अनुसार शैलियाँ: आज, चयनित, अन्य महीना, सामान्य (`DatePickerStyle` के माध्यम से)।

### जन्मतिथि
```java
DatePicker dp = new DatePicker()
   .title("Data de nascimento")
   .yearRange(100, 0)     // 100 साल पहले तक, भविष्य में कोई नहीं
   .setDate(2000, 0, 1);  // 01/Jan/2000 (महीना 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; // उदा.: LocaleFormats के अनुसार "01/01/2000"
   campoData.setText(data);
});
```

## अच्छे तरीके
- याद रखें कि `setDate` में **`month` 0-आधारित** है।
- महीनों/दिनों के नामों को स्थानीयकृत करने के लिए, सार्वजनिक स्थिरांक `MONTH_NAMES`/`MONTH_SHORT` को फिर से असाइन करें।

## सामान्य गलतियाँ
- **`setDate` में 1-आधारित महीना पास करना** — जनवरी `0` है।
- **निश्चित फ़ॉर्मेट की अपेक्षा करना** — आउटपुट `LocaleFormats.dateFormat`/`dateSeparator` का अनुसरण करता है।
- **`yearRange` को चयन के clamp के रूप में समझना** — यह केवल वर्षों के *नेविगेशन* को सीमित करता है; प्रदर्शित महीने का कोई भी दिन चयन योग्य है।

## यह भी देखें
- क्षेत्र गाइड: [`ui/`](/docs/ui) · रेसिपी: [`cookbook/`](/docs/cookbook)
- पैटर्न का आधार: [`Picker`](/docs/ui/widgets/picker)
- संबंधित घटक: [`TimePicker`](/docs/ui/widgets/timepicker)
