मुख्य सामग्री पर जाएँ
CrossFly 100% ओपन सोर्सGitHub पर फ़ॉलो करें
CrossFlyCrossFly
शुरू करें

यह पृष्ठ पुर्तगाली से मशीन-अनुवादित है और इसमें त्रुटियाँ हो सकती हैं। पुर्तगाली संस्करण प्रामाणिक है।

स्क्रीन से मान लौटाना

दो पैटर्न हैं, और सही पैटर्न चुनना एक आम बग से बचाता है।

⚠️ महत्वपूर्ण बिंदु

Window.show(onAnswer) onAnswer को केवल तभी चलाता है जब विंडो एक Picker हो (आंतरिक रूप से, hide() करता है answer = this instanceof Picker ? getAnswer() : null और कॉलबैक को केवल तभी कॉल करता है जब answer != null)। एक सामान्य स्क्रीन (Window की सबक्लास) के लिए, show(onAnswer) कोई मान नहीं लौटाता — कंस्ट्रक्टर द्वारा कॉलबैक पैटर्न का उपयोग करें।

पूर्ण उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)

package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.style.*;
import dev.crossfly.util.*;   // RunnableWith

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

      Label resultado = new Label("Nenhuma escolha ainda");
      add(LAY_AUTO, resultado);

      Button escolher = new Button("Escolher opção");
      // सामान्य स्क्रीन → callback कंस्ट्रक्टर द्वारा (show(cb) सिर्फ Picker में चलता है)।
      escolher.onAction(c ->
         new TelaSelecao(op -> resultado.setText("Escolheu: " + op)).show());
      add(LAY_AUTO, escolher);
   }
}

/** सामान्य स्क्रीन जो कंस्ट्रक्टर में मिले callback द्वारा मान लौटाती है। */
class TelaSelecao extends Window
{
   private final RunnableWith<String> onEscolha;

   public TelaSelecao(RunnableWith<String> onEscolha) { this.onEscolha = onEscolha; }

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

      Button a = new Button("Opção A");
      a.onAction(c -> { onEscolha.run("A"); hide(); });   // लौटाता है और बंद करता है
      add(LAY_AUTO, a);

      Button b = new Button("Opção B");
      b.onAction(c -> { onEscolha.run("B"); hide(); });
      add(LAY_AUTO, b);
   }
}

नीचे दिए गए स्निपेट केवल मुख्य भाग दिखाते हैं (जो onShow() के अंदर जाता है)। चलाने के लिए, उन्हें ऊपर दिए गए MainWindow ढाँचे में रखें।

पैटर्न 1 — कंस्ट्रक्टर द्वारा कॉलबैक (सामान्य स्क्रीनें)

स्क्रीन के कंस्ट्रक्टर को एक कॉलबैक भेजें; वह उसे hide() से पहले इनवोक करती है:

public class TelaSelecao extends Window {
   private final RunnableWith<String> onEscolha;
   public TelaSelecao(RunnableWith<String> onEscolha) { this.onEscolha = onEscolha; }

   @Override public void onShow() throws Exception {
      super.onShow();
      setLayout(new VerticalLayout());
      Button opa = new Button("Opção A");
      opa.onAction(c -> { onEscolha.run("A"); hide(); });   // लौटाता है और बंद करता है
      add(LAY_AUTO, opa);
   }
}

// उपयोग:
new TelaSelecao(resultado -> System.out.println("Escolheu: " + resultado)).show();

पैटर्न 2 — Picker + onAnswer (तैयार सेलेक्टर)

pickers (DatePicker, TimePicker, ColorPicker, आदि) पहले से ही getAnswer() लागू करते हैं। उनके लिए, show(onAnswer) का उपयोग करें:

new DatePicker().show(resposta -> {
   // सिर्फ != null होने पर चलता है (उपयोगकर्ता ने पुष्टि की; रद्द ⇒ getAnswer() null)
   System.out.println("Data: " + resposta);
});

अपना खुद का सेलेक्टर बनाने के लिए, Picker को विस्तारित करें और getAnswer() लागू करें।

⚠️ डायलॉग onAnswer का उपयोग नहीं करते

Alert और ActionSheet Window को विस्तारित करते हैं (Picker को नहीं), इसलिए show(callback) नहीं चलता। जवाब बटनों के कॉलबैक (buttonAction) से आता है — देखें डायलॉग और मोडल।

अच्छे तौर-तरीके

  • सामान्य स्क्रीनें → कंस्ट्रक्टर में कॉलबैक। सेलेक्टर → Picker + onAnswer।
  • स्क्रीनों के बीच साझा स्थिति के लिए, एक ViewModel/controller पर विचार करें (देखें आर्किटेक्चर)।

आम गलतियाँ

  • ऐसी स्क्रीन में minhaTela.show(cb) का उपयोग करना जो Picker नहीं है, cb के चलने की उम्मीद करते हुए (यह नहीं चलता)।
  • alert.show(cb) का उपयोग करना — कॉलबैक कभी नहीं चलता; buttonAction का उपयोग करें।

यह भी देखें

क्या यह पृष्ठ उपयोगी था?