यह पृष्ठ पुर्तगाली से मशीन-अनुवादित है और इसमें त्रुटियाँ हो सकती हैं। पुर्तगाली संस्करण प्रामाणिक है।
स्क्रीन से मान लौटाना
दो पैटर्न हैं, और सही पैटर्न चुनना एक आम बग से बचाता है।
⚠️ महत्वपूर्ण बिंदु
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का उपयोग करें।