# Group

> तार्किक रजिस्टर जो Options/Switches को परस्पर अनन्य (radio) बनाता है।

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

# Group

`Group` "चेक करने योग्य" कॉम्पोनेंट ([`option`](/docs/ui/widgets/option), [`switch`](/docs/ui/widgets/switch) और किसी भी `Checkable`) को **परस्पर अनन्य चयन** के लिए समूहित करता है — radio button व्यवहार। जब कोई सदस्य चिह्नित होता है, तो अन्य स्वचालित रूप से अचिह्नित हो जाते हैं, वैकल्पिक रूप से एनिमेटेड ट्रांज़िशन (fade) के साथ। यह एक `Component` नहीं है: **कुछ भी नहीं बनाता**, यह केवल सदस्यों का रजिस्टर + अनन्यता का तर्क है।

> 🟢 · **पैकेज:** `dev.crossfly.ui` · **विस्तारित करता है:** `java.lang.Object` (दृश्य नहीं) · **स्टाइल:** — (अपनी कोई स्टाइल नहीं)

## कब उपयोग करें
- [`option`](/docs/ui/widgets/option) के एक समूह को अनन्य radio buttons में बदलना।
- [`switch`](/docs/ui/widgets/switch) के एक समूह या अपने किसी भी `Checkable` को अनन्य बनाना।

## कब उपयोग न करें
- एकल टॉगल के लिए → समूह के बिना [`switch`](/docs/ui/widgets/switch) या [`option`](/docs/ui/widgets/option) पर्याप्त हैं।

## दिखावट
कोई नहीं। `Group` पूरी तरह तार्किक है। प्रत्येक बटन की दिखावट सदस्यों की ज़िम्मेदारी है (जिन्हें चेक करने योग्य दृश्य कॉम्पोनेंट होना चाहिए)।

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

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

/** चलाने योग्य मुख्य स्क्रीन। launcher (classname) की ओर संकेत करें और चलाएँ: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      Label saida = new Label("Selecionado: Cartão");
      add(LAY_AUTO, saida);

      // Group, Options को परस्पर अपवर्जी (radio) बनाता है, बदलाव पर fade के साथ
      Group g = new Group().fade(true);

      Option[] ops = {
         new Option("Cartão").group(g).checked(true),
         new Option("Boleto").group(g),
         new Option("Pix").group(g)
      };

      for (Option o : ops)
      {
         // Group चयनित को नहीं रखता: हर सदस्य सूचित करता है और हम isChecked() पढ़ते हैं
         o.onAction(c -> {
            for (Option x : ops)
               if (x.isChecked())
                  saida.setText("Selecionado: " + x.text);
         });
         add(LAY_AUTO, o);
      }
   }
}
```

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

## बुनियादी उपयोग
```java
Group g = new Group().fade(true);                       // fade = एनिमेटेड ट्रांज़िशन

Option a = new Option("Opção A").group(g);
Option b = new Option("Opção B").group(g);
Option c = new Option("Opção C").group(g);

container.add(LAY_AUTO, a);
container.add(LAY_AUTO, b);
container.add(LAY_AUTO, c);
// किसी एक को चुनने पर, बाकी fade के साथ अचयनित हो जाती हैं।
```

## कंस्ट्रक्टर
| कंस्ट्रक्टर | विवरण |
|---|---|
| `Group()` | खाली समूह, बिना fade के। |

## गुण और अनुकूलन
| गुण / मेथड | प्रकार | डिफ़ॉल्ट | क्या करता है |
|---|---|---|---|
| `fade(boolean)` | `Group` (फ्लुएंट) | `false` | चयन के एनिमेटेड ट्रांज़िशन को चालू/बंद करता है। |
| `fade` | `boolean` (फ़ील्ड) | `false` | fade की अवस्था (पठन)। |
| `add(Component)` | `void` | — | एक सदस्य पंजीकृत करता है (पहचान द्वारा, डुप्लिकेट को अनदेखा करता है)। |
| `remove(Component)` | `void` | — | एक सदस्य हटाता है (यदि सदस्य नहीं है तो no-op)। |
| `select(Component sender)` | `void` | — | `sender` **को छोड़कर** सभी सदस्यों को अचिह्नित करता है। |

> आम तौर पर आप `add`/`select` को सीधे **नहीं** कॉल करते: चेक करने योग्य स्वयं `.group(group)` के माध्यम से पंजीकृत होता है और चिह्नित होने पर `select(this)` कॉल करता है।

## कॉलबैक और इवेंट
`Group` के कोई कॉलबैक नहीं हैं। प्रत्येक सदस्य के `onAction` में परिवर्तनों पर प्रतिक्रिया दें और `isChecked()` से जांचें।

## अवस्थाएं
`Group` "कौन सा चयनित है" नहीं रखता — यह केवल यह सुनिश्चित करता है कि जब कोई सूचित करे कि वह चिह्नित हुआ, तो अन्य बंद रहें। **कोई `getSelected()` नहीं है**: प्रत्येक सदस्य में अवस्था जांचें (`isChecked()`)।

### पता लगाना कि कौन सा सदस्य चयनित है
```java
Group g = new Group();
Option[] ops = {
   new Option("Cartão").group(g).checked(true),
   new Option("Boleto").group(g),
   new Option("Pix").group(g)
};
for (Option o : ops)
   container.add(LAY_AUTO, o);

// किसी बिंदु पर (उदा.: "Confirmar" बटन):
for (Option o : ops)
   if (o.isChecked())
      System.out.println("selecionado: " + o.text);
```

## सर्वोत्तम प्रथाएं
- पंजीकरण को कॉम्पोनेंट पर छोड़ें: `.group(g)` आंतरिक रूप से पहले ही `group.add(this)` कॉल करता है।
- अनन्यता केवल इसलिए काम करती है क्योंकि `Option`/`Switch` चिह्नित होने पर `select(this)` कॉल करते हैं; एक अपना `Checkable` भी ऐसा ही करे।

## सामान्य गलतियां
- एक अस्तित्वहीन `getSelected()` ढूंढना — `isChecked()` जांचते हुए सदस्यों पर इटरेट करें।
- किसी सदस्य में `.group(g)` भूलना: वह परस्पर अनन्यता से बाहर रह जाता है।

## यह भी देखें
- क्षेत्र गाइड: [`ui/`](/docs/ui) · रेसिपीज़: [`cookbook/`](/docs/cookbook)
- अवधारणा (कॉम्पोनेंट की संरचना): [`concepts/`](/docs/concepts)
- संबंधित कॉम्पोनेंट: [`option`](/docs/ui/widgets/option) · [`switch`](/docs/ui/widgets/switch)
