# स्क्रीनों के बीच नेविगेट करना

> स्क्रीनों के बीच आगे बढ़ना और वापस जाना (push/pop) और गंतव्य स्क्रीन को डेटा भेजना।

Source: https://crossfly.dev/hi/docs/ui/navigation/navigate-between-screens — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# स्क्रीनों के बीच नेविगेट करना

## आप क्या सीखेंगे
- एक नई स्क्रीन पर आगे बढ़ना (`show()`) और वापस जाना (`hide()`)।
- गंतव्य स्क्रीन को **डेटा भेजना**।
- प्रत्येक स्क्रीन की UI कहाँ बनाएँ।

## पूर्वापेक्षाएँ
समझें कि हर स्क्रीन `Window` की एक सबक्लास है और UI `onShow()` में बनाई जाती है।

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

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

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

      add(LAY_AUTO, new Label("Lista"));

      Button abrir = new Button("Abrir detalhe do item 42");
      abrir.onAction(c -> new TelaDetalhe(42).show());   // push (आगे) — डेटा कंस्ट्रक्टर द्वारा
      add(LAY_AUTO, abrir);
   }
}

/** दूसरी स्क्रीन: कंस्ट्रक्टर द्वारा id पाती है और hide() से लौटती है। */
class TelaDetalhe extends Window
{
   private final int id;

   public TelaDetalhe(int id) { this.id = id; }   // डेटा कंस्ट्रक्टर द्वारा आता है

   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      add(LAY_AUTO, new Label("Detalhe do item " + id));

      Button voltar = new Button("Voltar");
      voltar.onAction(c -> hide());   // pop (वापस)
      add(LAY_AUTO, voltar);
   }
}
```
> नीचे दिए गए स्निपेट **केवल मुख्य भाग** दिखाते हैं (जो `onShow()` के अंदर जाता है)। चलाने के लिए, उन्हें ऊपर दिए गए `MainWindow` ढाँचे में रखें।

## आगे बढ़ना (push) और वापस जाना (pop)
```java
public class TelaLista extends Window {
   @Override public void onShow() throws Exception {
      super.onShow();
      setLayout(new VerticalLayout());
      Button abrir = new Button("Abrir detalhe");
      abrir.onAction(c -> new TelaDetalhe(42).show());   // push (आगे)
      add(LAY_AUTO, abrir);
   }
}

public class TelaDetalhe extends Window {
   private final int id;
   public TelaDetalhe(int id) { this.id = id; }          // डेटा कंस्ट्रक्टर द्वारा आता है
   @Override public void onShow() throws Exception {
      super.onShow();
      setLayout(new VerticalLayout());
      add(LAY_AUTO, new Label("Detalhe do item " + id));
      Button voltar = new Button("Voltar");
      voltar.onAction(c -> hide());                       // pop (वापस)
      add(LAY_AUTO, voltar);
   }
}
```

## अगली स्क्रीन को डेटा भेजना
कोई "रूट आर्गुमेंट" नहीं हैं। गंतव्य `Window` के **कंस्ट्रक्टर के माध्यम से भेजें** (जैसे ऊपर `id`)।
ऑब्जेक्ट के लिए, संदर्भ भेजें: `new TelaCliente(cliente).show();`।

## UI कहाँ बनाएँ
- **`onShow()`** (`super.onShow()` के साथ): यहाँ `Screen.width/height` और विंडो के बाउंड्स पहले से मान्य हैं।
- कंस्ट्रक्टर में **न** बनाएँ — बाउंड्स तैयार नहीं हो सकते।

## अच्छे तौर-तरीके
- डेटा को **पेंट थ्रेड के बाहर** लोड करें और UI भरने के लिए `Component.onUI(...)` के साथ वापस आएँ।
- `onRemove()` में संसाधन (टाइमर, कर्सर) मुक्त करें।

## आम गलतियाँ
- कंस्ट्रक्टर में UI बनाना (अमान्य बाउंड्स) या `super.onShow()` भूल जाना।
- "नामित आर्गुमेंट वाले बैक-स्टैक" की उम्मीद करना — डेटा कंस्ट्रक्टर के माध्यम से भेजें।

## यह भी देखें
- [स्क्रीन से मान लौटाना](/docs/ui/navigation/returning-results) · [विंडो स्टैक](/docs/ui/navigation/the-window-stack)
