मैं मूल रूप से क्या पूछा स्पष्ट रूप से मेरे सवाल/समस्या राज्य नहीं था के रूप में संचालित बटन एक निरीक्षण गुण खिड़की बनाएं,, इसलिए मैं इसे बेहतर समझा जाएगा। मेरे पास JButton
है जो दृश्य के लिए JDialog
सेट करता है। JDialog में WindowListener
है जो इसे windowDeactivated()
ईवेंट पर दिखाई नहीं देता है, जो किसी भी समय उपयोगकर्ता द्वारा संवाद के बाहर क्लिक करने पर ट्रिगर किया जाता है। बटन ActionListener
जांचता है कि क्या संवाद सत्य है, यदि सत्य है तो इसे छुपाता है, तो गलत लगता है।एक JDialog
windowDeactivated()
हमेशा या नहीं बटन पर क्लिक या, जब तक संवाद बाहर उपयोगकर्ता क्लिक करता है के रूप में ट्रिगर किया जाएगा। मेरी समस्या यह है कि जब उपयोगकर्ता संवाद बंद करने के लिए बटन क्लिक करता है। संवाद WindowListener
द्वारा बंद किया गया है और फिर ActionListener
इसे प्रदर्शित करने का प्रयास करता है।
यदि windowDeactivated()
setVisible(false)
नहीं है, तो संवाद अभी भी खुला है, लेकिन मूल विंडो के पीछे है। मैं जो पूछ रहा हूं वह है कि windowDeactivated()
के अंदर क्लिक के स्थान तक पहुंच कैसे प्राप्त करें। यदि मुझे पता है कि उपयोगकर्ता बटन और विंडो पर क्लिक किया गया है (सक्रिय) संवाद को छिपा सकता है, ताकि बटन ActionListener
देख सके कि यह अभी भी दिखाई दे रहा है और इसे छुपा रहा है।
public PropertiesButton extends JButton { private JDialog theWindow; public PropertiesButton() { theWindow = new JDialog(); theWindow.setUndecorated(true); theWindow.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); theWindow.add(new JMenuCheckBoxItem("Something")); theWindow.addWindowListener(new WindowListener() { // just an example, need to implement other methods public void windowDeactivated(WindowEvent e) { theWindow.setVisible(false); } }); this.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (theWindow.isVisible()) { theWindow.setVisible(false); } else { JButton btn = (JButton)e.getSource(); theWindow.setLocation(btn.getLocationOnScreen.x,btn.getLocationOnScreen.x-50); theWindow.setVisible(true); } } }); theWindow.setVisible(false); } }
सुनिश्चित नहीं है कि सवाल क्या है। ऐसा लगता है कि आप इसे समझ चुके हैं। यह सही दिखता है। (पहली नज़र में) – jjnguy
जो मैंने ऊपर किया है वह सब कुछ करेगा जो मैं चाहता था, सिवाय इसके कि जब संवाद के बाहर क्लिक किया जाए। बाहर क्लिक करने से संवाद बंद हो जाता है, जो ठीक है, लेकिन जब मैं संवाद खोलने के लिए बटन क्लिक करता हूं, तो यह पहली बार नहीं खुलता है।जो मैं समझता हूं, से विंडोलिस्टर एक्शनलिस्टर से पहले ट्रिगर करता है और भले ही एक्शनलिस्टर ट्रिगर होने पर संवाद वास्तव में दिखाई नहीं दे रहा है, तो .isVisible() कॉल एक सत्य देता है। तो, बटन होगा .setVisible (झूठा) भले ही यह दिखाई नहीं दे रहा है। – Brian
ब्रायन, आप विंडो श्रोता के बजाय 'विंडो एडाप्टर' का उपयोग कर सकते हैं। फिर आपको केवल अपनी इच्छित विधियों को लागू करना होगा। – jjnguy