2009-08-16 17 views
7

मैं स्विंग JDialog में एक रद्द बटन कैसे सेट कर सकता हूं, यानी एक बटन जिसका क्रिया स्वचालित रूप से किया जाता है यदि उपयोगकर्ता कीबोर्ड पर "रद्द करें" कुंजी दबाता है?JDialog रद्द करें बटन

समकक्ष को संवाद की रूट फलक के setDefaultButton विधि के माध्यम से डिफ़ॉल्ट कार्रवाई के लिए पेश किया जाता है।

यदि यह मदद कर रहा है, तो मैं WinForms Form.CancelButton संपत्ति के लिए एनालॉग खोज रहा हूं।

+0

मान लीजिए कि आप बचने की कुंजी का मतलब है .. – NateS

उत्तर

1

मुझे नहीं लगता कि यह बिना विस्तार किए जेडियलॉग के साथ संभव है।

आप (या संभवतः अन्य शो तरीकों में से एक) JOptionPane.showOptionDialog (इस्तेमाल कर सकते हैं), JButtons आप इस्तेमाल किया जा करना चाहते हैं गुजर।

विकल्पों पारित कर दिया घटक हैं, वे सामान्य रूप में प्रदान किया जाएगा, ताकि आप कुछ इस तरह कर सकते हैं:

int optionType = JOptionPane.DEFAULT_OPTION; 
int messageType = JOptionPane.PLAIN_MESSAGE; // no standard icon 

JButton ok = new JButton("ok"); 
JButton cancel = new JButton("cancel"); 
//add any handlers to the buttons 
... 
//construct options 
Object[] selValues = { ok, cancel }; 

//show dialog as normal, selected index will be returned. 
int res = JOptionPane.showOptionDialog(null, "message", 
     "title", optionType, messageType, null, selValues, 
     selValues[0]); 
+0

हाय रिच, उदाहरण के लिए धन्यवाद। दुर्भाग्यवश, मुझे कई अलग-अलग नियंत्रणों के साथ एक पूरी तरह से अनुकूलित संवाद की आवश्यकता है, न केवल एक व्यक्तिगत विकल्प संवाद। जहां तक ​​मैं देख सकता हूं, वहां कोई विधि/अधिभार नहीं है जिसे पूरी तरह से अनुकूलित पैनल पारित किया जा सकता है। –

+1

मुझे लगता है कि आप सही हैं, यदि आपके पास एक कस्टम संवाद है, तो आपको अपने आप को संभालने की आवश्यकता होगी, हालांकि आप जॉक्शनपेन से ऐसा करने के लिए प्रसंस्करण को हटा सकते हैं। FWIW SWT में आप संवाद की एक मनमाना उपवर्ग को परिभाषित करने और इसे 'डाल()' विधि के लिए दूसरा तर्क –

2

सिंगल लाइन समाधान

t.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) 
    .put(KeyStroke.getKeyStroke("ESCAPE"), btnCancel.getAction()); 

जहां किसी भी घटक है (जेबटन को छोड़कर) संवाद में जेटीक्स्टफिल्ड की तरह।

+1

कार्रवाई नक्शे में एक महत्वपूर्ण है, न कि 'Action' है प्रदर्शित करने के लिए अपनी खुली() विधि कॉल कर सकते हैं। यह केवल तभी काम करेगा यदि 'btnCancel.getAction()! = Null', और यदि' btnCancel.getAction() 'द्वारा वापस' एक्शन 'को' t' 'के लिए एक्शन मैप में कुंजी के रूप में स्वयं के रूप में पंजीकृत किया गया था, यानी। अगर 't.getActionMap() डाल दें (btnCancel.getAction(), btnCancel.getAction()) जिसे पहले कहा गया था। – Jesse

1

आपको बस इतना करना है कि बटन में एक्शन श्रोता संलग्न करें और इसके अंदर dialog.setVisible(false) पर कॉल करें।

+0

बस कोशिश करें ... यह वास्तव में –

+0

काम करता है आप सवाल का जवाब नहीं देते हैं। यह सामान्य रूप से एस्केप कुंजी के साथ एक कीस्ट्रोक के साथ एक संवाद को खारिज करने वाला था। कम से कम इस तरह मैंने सवाल पढ़ा, जो इसे फिर से पढ़ने पर थोड़ा अस्पष्ट है। – PhiLho

+0

ओह, इसे इंगित करने के लिए धन्यवाद। प्रश्न को "रद्द करें" कुंजी, "नहीं" बटन पढ़ना चाहिए "। मैं इसे ठीक कर दूंगा। –

3

मैं देख सकता हूं कि सबसे अच्छा तरीका रूट फलक के क्रिया मानचित्र पर Action जोड़ना है, और उस रूट को रूट फलक के इनपुट मानचित्र का उपयोग करके एस्केप कुंजी से लिंक करना है।

इसके लिए, आपको Action की आवश्यकता है। (। यानी cancelButton.getAction() != null) अपने को रद्द बटन के व्यवहार एक कार्रवाई के रूप में कार्यान्वित किया जाता है, तो यह काम करेगा:

 
getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "CANCEL"); 
getRootPane().getActionMap().put("CANCEL", cancelButton.getAction()); 

अन्यथा, यदि रद्द बटन के तर्क एक ActionListener के माध्यम से कार्यान्वित किया जाता है, तो आप ActionListener की actionPerformed() विधि हो सकता था private void onCancel() विधि को कॉल करें जो तर्क लागू करता है, और एक ही विधि को "रद्द करें" क्रिया पंजीकृत करता है।

 
getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "CANCEL"); 
getRootPane().getActionMap().put("CANCEL", new AbstractAction(){ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     onCancel(); 
    } 
}); 
संबंधित मुद्दे