यह पृष्ठ पुर्तगाली से मशीन-अनुवादित है और इसमें त्रुटियाँ हो सकती हैं। पुर्तगाली संस्करण प्रामाणिक है।
किसी स्क्रीन से परिणाम कैसे प्राप्त करें
उद्देश्य। आप उपयोगकर्ता के लिए कुछ चुनने/भरने हेतु एक स्क्रीन खोलते हैं और आपको वापस मान चाहिए। CrossFly में दो अलग-अलग तंत्र हैं: pickers के लिए show(onAnswer), और सामान्य स्क्रीन के लिए कंस्ट्रक्टर में callback।
उपयोग की गई APIs
Window.show(RunnableWith<Object> onAnswer)— परिणाम का एक callback पंजीकृत करता है। स्रोत में, callback केवल तभी चलता है जबgetAnswer() != null, औरWindow.getAnswer()डिफ़ॉल्ट रूप सेnullलौटाता है — केवलPickerहीgetAnswer()को ओवरराइड करता है। यानी: सामान्य स्क्रीन के लिए यह callback कभी नहीं चलता।Picker.getAnswer()— चुना गया मान लौटाता है, या रद्द होने परnull। केवल pickers ही इसे लागू करते हैं।- कंस्ट्रक्टर में callback — सामान्य स्क्रीन के लिए मानक तरीका: स्क्रीन के कंस्ट्रक्टर को एक
RunnableWith<T>(या अपना कोई इंटरफ़ेस) पास करें औरhide()से पहले उसे invoke करें।
पूर्ण उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)
package com.exemplo;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
/** मुख्य निष्पादन योग्य स्क्रीन: चयन स्क्रीन खोलती है और कंस्ट्रक्टर में callback के जरिए परिणाम प्राप्त करती है। */
public class MainWindow extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
add(new Label("Nenhum cliente escolhido"));
add(new Button("Escolher cliente").onAction(e ->
// सामान्य स्क्रीन — कंस्ट्रक्टर में callback के जरिए परिणाम (यहां show(onAnswer) काम नहीं करता)।
new SelecionarClienteTela(cliente -> Hint.show("Escolhido: " + cliente.nome, 1500)).show()));
}
}
/** सरल उदाहरण मॉडल। */
class Cliente
{
final String nome;
Cliente(String nome) { this.nome = nome; }
}
/** चयन स्क्रीन: बंद होने से पहले कंस्ट्रक्टर callback के जरिए परिणाम देती है। */
class SelecionarClienteTela extends Window
{
private final RunnableWith<Cliente> onPick;
public SelecionarClienteTela(RunnableWith<Cliente> onPick) { this.onPick = onPick; }
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
add(new Button("Escolher Ana").onAction(e ->
{
if (onPick != null) onPick.run(new Cliente("Ana")); // परिणाम देता है
hide(); // फिर बंद करता है
}));
}
}
नीचे का अंश केवल मुख्य भाग दिखाता है। चलाने के लिए, इसे ऊपर दिए गए
MainWindowढाँचे में रखें।
न्यूनतम अंश
// स्रोत में सत्यापित: hide() केवल तभी onAnswer.run(answer) कॉल करता है जब (this instanceof Picker) और answer != null
// 1) PICKER — show(onAnswer) का उपयोग करता है। केवल गैर-null परिणाम (पुष्टि किए गए चयन) पर फायर होता है।
DatePicker picker = new DatePicker(/* ... */);
picker.show(answer ->
{
Date d = (Date) answer; // यहां कभी null नहीं होता; रद्द करने पर callback फायर नहीं होता
Hint.show("Data: " + d, 1500);
});
// 2) सामान्य स्क्रीन — कंस्ट्रक्टर में callback के जरिए परिणाम (यहां show(onAnswer) काम नहीं करता)।
public class SelecionarClienteTela extends Window
{
private final RunnableWith<Cliente> onPick;
public SelecionarClienteTela(RunnableWith<Cliente> onPick) { this.onPick = onPick; }
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new GridLayout());
add(new Button("Escolher Ana").onAction(e ->
{
if (onPick != null) onPick.run(new Cliente("Ana")); // परिणाम देता है
hide(); // फिर बंद करता है
}));
}
}
// कॉल:
new SelecionarClienteTela(cliente -> Hint.show("Escolhido: " + cliente.nome, 1500)).show();
दो रास्ते क्यों? hide() onAnswer को केवल Picker के लिए कॉल करता है (instanceof Picker जाँच Window.hide() के कोड में है)। सामान्य स्क्रीन के लिए, कंस्ट्रक्टर का callback स्पष्ट अनुबंध है — और यह Object के बजाय परिणाम को टाइप (RunnableWith<Cliente>) करने की अनुमति देता है।
और गहराई में जाएँ
- परिणाम लौटाना · स्क्रीनों के बीच नेविगेट करना
- संबंधित रेसिपी: स्क्रीन खोलना और बंद करना
क्या यह पृष्ठ उपयोगी था?प्रतिक्रिया के लिए धन्यवाद!