2011-02-02 6 views
7

मेरे पास 2 स्विंग कक्षाएं हैं जो JFrame फैली हुई हैं। दोनों में कन्स्ट्रक्टर में show() विधि है। ClassOne से मैंने बटन क्लिक ईवेंट पर ClassTwonew ClassTwo() कहा। लेकिन अगर मैं बटन दबाता हूं तो ClassTwo के लिए नई विंडो खोली जाती है। तो यदि कक्षा एक दो विंडो खोला गया है तो मैं कक्षा दो विंडो खोलना बंद कर सकता हूं?स्विंग एपीआई का उपयोग करके डुप्लिकेट विंडो खोलने को कैसे रोकें?

संपादित

अब इस समस्या का समाधान है, लेकिन अब जब मैं पहली बार खुला ClassTwo खिड़की यह एक खिड़की को दर्शाता है। फिर इसे बंद करने के बाद जब मैं कक्षा दो खिड़की खोलता हूं तो यह दो खिड़की खुलता है और यह गिनती बढ़ती रहती है। यह क्यों हो रहा है?

संपादित 2

मैंने पाया कि इसकी समस्या लेकिन Samck एपीआई के MultiUsreChat वर्ग से अपनी समस्या स्विंग नहीं। तो जिसने इस पर काम किया है, मेरी मदद करो।

ClassOne में कोड है:

if(!winList.contains(room_jid)){ 
    new ClassTwo(room_jid,....); 
    winList.add(room_jid); 
} 

और ClassTwo में है:

public ClassTwo(....){ 
...... 
    this.muc = new MultiUserChat(connection, room_jid); 
    if(!muc.isJoined()) 
     muc.join(this.user_id);  //---- This line opens previously closed window. 
..... 

    if(!isVisible()) 
     show(); 

} 

संपादित 3

classone के निर्माता

public ClassOne(){ 
    JButton btn = new JButton("Open"); 
    btn.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
     if(!winList.contains(room_jid)){ 
      new ClassTwo(room_jid,....); 
      winList.add(room_jid); 
     } 
    } 
    }); 
} 

उत्तर

0

का उपयोग कर कारण यह काम नहीं करता है कि आप बटन हैंडलर, आप एक नई विंडो हर बार बटन दबाने बनाने जिसका अर्थ है अंदर ClassTwo का एक नया उदाहरण पैदा कर रहे है की कोशिश करो। यह काम करना चाहिए:

private Map<JButton, ClassTwo> classTwoMap; 

public ClassOne(){ 
    classTwoMap = new HashMap<JButton, ClassTwo>(); 
    ClassTwo bn1window = new ClassTwo(); 
    bn1window .setVisible(false); 
    //initialisation code for your window 
    ..... 
    JButton btn = new JButton("Open"); 
    btn.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
     classTwoMap.Get(e.getSource()).setVisible(true); 
    } 
    }); 

    classTwoMap.Get(btn).setvisible(false); 
} 

//Edit: 
public ClassTwo() { 
    // This will hide the window when closed, and the button will re-"open" it. 
    setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 
} 

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

एकाधिक विंडो और बटन के लिए संपादित किया गया।

+0

@Kdansky: यह समाधान मेरे लिए उपयोगी नहीं है क्योंकि मैं एक ही समय में कई क्लास दो खिड़कियां खोलना चाहता हूं। इसलिए जब भी मैं बटन पर क्लिक करता हूं तो मुझे नया उदाहरण बनाना होगा। –

+0

आपने लिखा "तो यदि क्लास दो विंडो खोला गया है तो मैं कक्षा दो विंडो खोलना बंद कर सकता हूं?"। कृपया स्पष्ट करें। –

+0

@Kdansky: यह मेरा प्रश्न था जिसे हल किया गया था लेकिन अगला सवाल यह है कि यह पहले बंद खिड़कियां खोल रहा है। मेरा 'संपादित करें' देखें। –

4

क्लासवो कन्स्ट्रक्टर में फ्रेम को दृश्यमान न बनाएं। इसके बजाय, classOne में classTwo के लिए एक संदर्भ रखने के लिए, और जब बटन क्लिक किया जाता है, यह दिखाई दे, ताकि जैसे:, बाहर निकलें के बजाय

//on button click 
if(classTwo == null){ 
    classTwo = new ClassTwo(); 
} 
classTwo.setVisible(true); 

इसके अलावा classTwo के डिफ़ॉल्ट करीब आपरेशन बदलने के पास पर छिपाने के लिए:

setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 

तो इससे कोई फ़र्क नहीं पड़ता कि बटन कितनी बार क्लिक किया गया है, क्योंकि यह सब मौजूदा घटना को दृश्यमान बनाता है। यह नए उदाहरण नहीं बनाता है।

+0

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

+0

आपको वह कोड दिखाना चाहिए जो कक्षा दो विंडो बनाता है। – dogbane

+0

मैंने अपना कोड एक नज़र डाला है। –

3

ClassOne में आप बस याद कर सकते हैं कि आपने एक boolean का उपयोग करके खोला है या नहीं।

//in event handler for the button 
if (!classTwoShown) 
{ 
    classTwoShown = true; 
    new ClassTwo(); 
} 

तुम भी दो वर्ग के निपटाने घटना में हुक चाहिए classTwoShown झंडा पुनर्स्थापित करने के लिए।

2

सिंगलटन पैटर्न

+1

क्या आप अधिक कारण बताएंगे कि मुझे एकल टन पैटर्न के बारे में पता नहीं है। –

+0

http://www.javabeginner.com/learn-java/java-singleton-design-pattern – yahh

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