2010-11-03 9 views
40

मैंने एक कस्टम जेडियलॉग बॉक्स बनाया है जिसमें एक कस्टम ड्राइंग और जेबटन है। जब मैं जेबटन पर क्लिक करता हूं, तो जेडियलॉग बॉक्स बंद होना चाहिए और एक मूल्य वापस किया जाना चाहिए।मैं जेडीअलॉग बॉक्स से मूल जेएफआरएएम में एक मूल्य कैसे वापस कर सकता हूं?

मैंने पैरेंट जेएफआरएम में सेटमोडालपीस नामक एक फ़ंक्शन बनाया है, जो एक मान प्राप्त करता है और इसे स्थानीय JFrame चर में सेट करता है।

समस्या यह है कि यह फ़ंक्शन जेडियलॉग बॉक्स से दिखाई नहीं दे रहा है (भले ही जेडियलॉग बॉक्स में मूल जेएफआरएम का संदर्भ हो)।

दो प्रश्न: 1) क्या जेडीअलॉग बॉक्स से अपने मूल जेएफआरएएम में मूल्य वापस करने का कोई बेहतर तरीका है?

2) JFrame को पास किए गए जेएफआरएएम का संदर्भ क्यों नहीं जा सकता है जो मेरे जेएफआरएएम फ़ंक्शन सेट मॉडेलपीस तक पहुंचने के लिए उपयोग किया जा सकता है?

उत्तर

21

आपको अपने कस्टम JDialog पर एक कस्टम विधि getValue() जोड़कर विपरीत करना चाहिए।

इस तरह से आप JFrame से संवाद के मूल्य से पूछ सकते हैं कि इसे JFrame पर कुछ भी आमंत्रित करके इसे सेट करें।

यह कहा गया

आप एक कस्टम संवाद डिज़ाइन कर रहे हैं आप ओरेकल संवाद here के बारे में ट्यूटोरियल पर एक नज़र डालें, तो आप अपने संवाद के एपीआई डिजाइन करने के लिए इतना है कि आप क्या उपयोगकर्ता के बारे में संवाद क्वेरी कर सकता है की जरूरत है चुना है। उदाहरण के लिए, कस्टमडिअलॉग में एक GetValidatedText विधि है जो उपयोगकर्ता द्वारा दर्ज किए गए पाठ को लौटाती है।

95

मैं आम तौर पर इस तरह यह कर (आप वे कैसे लगता है कि आप अपने कस्टम संवाद डिजाइन करेंगे देखने के लिए CustomDialog का स्रोत मिल सकता है):

Dialog dlg = new Dialog(this, ...); 
Value result = dlg.showDialog(); 

Dialog.showDialog() समारोह इस तरह दिखता है :

ReturnValue showDialog() { 
    setVisible(true); 
    return result; 
} 

चूंकि जेडीअलॉग पर सत्य की दृश्यता स्थापित करना है एक मोडल ऑपरेशन, ओके बटन संवाद के चुने हुए परिणाम (या null रद्द होने पर) के लिए एक आवृत्ति चर (result) सेट कर सकता है। ठीक/रद्द करें बटन विधि में प्रसंस्करण के बाद, ऐसा करते हैं:

setVisible(false); 
dispose(); 

showDialog() कार्य करने के लिए नियंत्रण वापस जाने के लिए।

+0

इस के लिए धन्यवाद! मैं इसे पूरा करने के तरीके पर आखिरी घंटे खोज रहा हूं, और यह ठीक वैसे ही काम करता था जैसा मैं चाहता था। – BMB

+8

छोटी टिप्पणी - यदि आप जेडियलॉग का उपयोग करते हैं तो आपको इसे कन्स्ट्रक्टर में सही पैरामीटर या सेटमोडाल (सत्य) के माध्यम से मोडल के रूप में घोषित करना होगा; –

0

जब आप JFrame को JDialog पर कोई मान देते हैं तो जब भी आप कॉल करना चाहते हैं तो jdialog के parametrized कन्स्ट्रक्टर और jframe में बनाते हैं। उदा। parametrized निर्माता की तरह:

public EditProduct(java.awt.Frame parent, boolean modal, int no) { 
     //int no is number of product want to edit. 
     //Now we can use this pid in JDialog and perform whatever you want. 
} 

आप सेट के साथ एक सेम वर्ग बनाने JFrame को JDialog से मूल्यों गुजरती हैं और विधि प्राप्त करना चाहते हैं मानों वेक्टर का उपयोग करने और JFrame में इन मूल्यों को मिलता है। More info

4

मुझे नहीं पता कि मैं अपनी विधि को शांत तरीके से समझा सकता हूं ... आइए कहें कि मुझे उत्पाद की आवश्यकता है और जेडीअलॉग से राशि जो उपयोगकर्ता से यह जानकारी प्राप्त करने जा रही है, मुझे उसे जेएफआरएएम से कॉल करने की आवश्यकता है।

उत्पाद की घोषणा करें और JDialog के अंदर सार्वजनिक गैर स्थैतिक वैश्विक चर के रूप में राशि अर्जित करें।

public float productPrice; 
public int ammount; 

* यह संवाद वर्ग के वैश्विक दायरे के अंदर जाता है।

JDialog निर्माता में इन पंक्तियों को जोड़ने के साधन सुनिश्चित करने के लिए

super((java.awt.Frame) null, true); 
setModalityType(java.awt.Dialog.ModalityType.APPLICATION_MODAL); 

* इस संवाद की क्लास निर्माता

मान लीजिए कि आपके JDialog की क्लास नाम 'MyJDialog' है अंदर चला जाता है, जब बुला कुछ इस तरह करते हैं

MyJDialog question = new MyJDialog(); 
MyJDialog.setVisible(true); 
// Application thread will stop here until MyJDialog calls dispose(); 
// this is an effect of modality 
// 
// When question calls for dispose(), it will leave the screen, 
// but its global values will still be accessible. 
float myTotalCostVar = question.productPrice * question.ammount; 
// this is acceptable. 
// You can also create public getter function inside the JDialog class, 
// its safer and its a good practice. 

* यह आपके JFrame के भीतर किसी भी समारोह में चला जाता है और infos मिल करने के लिए JDialog कॉल करेंगे।

0

यहां यह है कि मैं आमतौर पर इसे कैसे करता हूं। मुझे यकीन है कि नहीं था, यही कारण है कि मेरे द्वारा बनाए गए पोस्ट को बताया गया है:

Returning value from JDialog; dispose(), setVisible(false) - example

0

अपने निर्माता के लिए एक इंटरफेस जोड़ें

public class UploadConfimation extends JDialog { 

private final JPanel contentPanel = new JPanel(); 


public interface GetDialogResponse{ 
    void GetResponse(boolean response); 
} 



/** 
* Create the dialog. 
*/ 
public UploadConfimation(String title, String message, GetDialogResponse result) { 
    setBounds(100, 100, 450, 300); 
    setTitle(title); 
    getContentPane().setLayout(new BorderLayout()); 
    contentPanel.setLayout(new FlowLayout()); 
    contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    getContentPane().add(contentPanel, BorderLayout.CENTER); 
    { 
     JLabel lblMessage = new JLabel(message); 
     contentPanel.add(lblMessage); 
    } 
    { 
     JPanel buttonPane = new JPanel(); 
     buttonPane.setLayout(new FlowLayout(FlowLayout.CENTER)); 
     getContentPane().add(buttonPane, BorderLayout.SOUTH); 
     { 
      JButton okButton = new JButton("YES"); 
      okButton.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent arg0) { 
        result.GetResponse(true); 
        dispose(); 
       } 
      }); 
      buttonPane.add(okButton); 
      getRootPane().setDefaultButton(okButton); 
     } 
     { 
      JButton cancelButton = new JButton("NO"); 
      cancelButton.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent arg0) { 
        result.GetResponse(false); 
        dispose(); 
       } 
      }); 
      buttonPane.add(cancelButton); 
     } 
    } 
} 

}

संबंधित मुद्दे

 संबंधित मुद्दे