2011-06-25 14 views
7

में बदलना मेरे पास एक वर्ग है जो जेएफआरएएम बढ़ाता है, और इसमें सीमा सीमा है। इसमें जेपीनल टाइप के दो निजी आवृत्ति चर हैं। वे बटन के पैनलों का प्रतिनिधित्व करते हैं और उन्हें फ्लिप बटन और आत्मविश्वास बुट्टन्स कहा जाता है। जब आप बटन पर क्लिक करते हैं, तो बटन के पैनल को बटन के दूसरे पैनल द्वारा प्रतिस्थापित किया जाता है। यही है, यदि आप फ्लिपबटन में एक बटन पर क्लिक करते हैं, तो फ्लिपबटन को आत्मविश्वास बटन द्वारा प्रतिस्थापित किया जाता है। मैं इस तरह यह करने की कोशिश की:जेपीनेल के साथ जेपीनेल को जेएफआरएएम

 
    private class FlipListener implements ActionListener{ 
    public void actionPerformed(ActionEvent e){ 
     remove(flipButton); 
     add(confidenceButtons,BorderLayout.SOUTH); 
     validate(); 
     ... 
    } 
    } 
    private class ColorListener implements ActionListener{ 
    ... 
    public void actionPerformed(ActionEvent e){ 
     ... 
     remove(confidenceButtons); 
     add(flipButton,BorderLayout.SOUTH); 
     validate(); 
    } 
    } 

flipButton में बटन FlipListeners है और confidenceButtons में लोगों ColorListeners है। जब प्रोग्राम चलाया जाता है, तो बटन पर क्लिक करने से पैनल हटा दिया जाएगा, लेकिन इसे बदलने के लिए कुछ भी नहीं जोड़ा जाता है। मैं क्या गलत कर रहा हूं?

संपादित

CardLayout निकला एक सरल और आसान समाधान किया जाना है। यह पता चला है कि उपर्युक्त कोड काम करता है; समस्या मेरे कोड के दूसरे खंड में एक टाइपो थी। >। < हालांकि, मुझे इन विधियों का उपयोग करने में हमेशा परेशानी होती है, और मुझे लगता है कि कार्डलाउट, मेरे लिए इसे सरल बनाता है। धन्यवाद।

उत्तर

6

उपयोग एकपर देखने के है, जैसा कि here दिखाया गया है।

Game viewHigh Scores view

+0

को भी देखें मेरा पहला विचार। कार्डलेआउट इस उपयोग के मामले के लिए डिज़ाइन किया गया है, यह सबसे अच्छी रखरखाव योग्य विकल्प है। – extraneon

+0

सरल समाधान और एक आकर्षण की तरह काम किया। धन्यवाद! – Shelley

5

पुनः सत्यापित() + रीपेंट() चाल होना चाहिए, उदाहरण के here

संपादित करें:

लगता है कि आप उस के साथ समस्या मिल गया है, कि here और here और फिर example by trashgod के लिए उदाहरण, निर्मित करने में संकोच न अपने प्रश्न कोड के आधार पर फिर से

एक और तरीका है उत्कृष्ट उदाहरण एंड्रयू थॉम्पसन द्वारा जोड़ा :-) +1

+0

मैंने उदाहरण देखा लेकिन काफी समझ में नहीं आया। मैं ग्राफिक्स का उपयोग नहीं कर रहा हूं क्योंकि पुन: आवश्यक क्यों है? क्या मैं आत्मविश्वास पर सभी तीन तरीकों को बुलाऊंगा? उदाहरण बहुत विशिष्ट दिखता है और मुझे वास्तव में यह नहीं पता कि इसे मेरे कोड में कैसे अनुकूलित किया जाए। – Shelley

+0

+1 यह भी देखें [उदाहरण] (http://stackoverflow.com/questions/5812002/removeall-not-removing-at-next-validate/5812981#5812981)। – trashgod

+0

@ शेली उदाहरण विशिष्ट avourt revalidate + मान्य + repaint, repaint() के बारे में questin पर वापस, ज्यादातर मामलों में जीयूआई सही ढंग से काम करता है और repaint() के लिए आवश्यक नहीं है; हमम और इस बारे में विस्तृत स्विंग ट्यूटोरियल या विस्तृत विवरण मौजूद नहीं हैं :-) – mKorbel

1

getContentPane उपयोग करने का प्रयास() कॉल करने के लिए निकाल सकते हैं(), जोड़ने() पद्धतियों ect ..:

getContentPane().remove(flipButton); 
getContentPane().add(confidenceButtons,BorderLayout.SOUTH); 
getContentPane().revalidate(); 
getContentPane().repaint(); 

संपादित करें: इस कोड bellow मेरे लिए काम:

import java.awt.BorderLayout; 
import java.awt.HeadlessException; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class Frame extends JFrame { 
JPanel flipButton =new JPanel(); 
JPanel confidenceButtons =new JPanel(); 



    public Frame() throws HeadlessException { 
    super(); 
    this.setLayout(new BorderLayout()); 
    JButton b1=new JButton("flip"); 
    b1.addActionListener(new FlipListener()); 
    flipButton.add(b1); 

    JButton b2=new JButton("color"); 
    b2.addActionListener(new ColorListener()); 
    confidenceButtons.add(b2); 
    this.getContentPane().add(flipButton,BorderLayout.SOUTH); 
    this.setSize(250,250); 
    this.pack(); 
    this.setVisible(true); 

} 
    private class FlipListener implements ActionListener{ 
     public void actionPerformed(ActionEvent e){ 
      remove(flipButton); 
      add(confidenceButtons,BorderLayout.SOUTH); 
      validate(); 
      repaint(); 

     } 
     } 
     private class ColorListener implements ActionListener{ 

     public void actionPerformed(ActionEvent e){ 

      remove(confidenceButtons); 
      add(flipButton,BorderLayout.SOUTH); 
      validate(); 
      repaint(); 
     } 
     } 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     new Frame(); 

    } 

} 
+0

यदि आप अपना पूरा जेएफआरएएम क्लास कोड पोस्ट कर सकते हैं तो मैं इसे ठीक करने का प्रयास कर सकता हूं। शायद Borederlayout के बजाय एक और लेआउट का उपयोग करने का प्रयास करें। बी/सी सीमावर्ती कभी-कभी कुछ अजीब व्यवहार का कारण बनता है – othman

+0

मुझे लगता है कि इससे कोई फर्क नहीं पड़ता। मैंने पढ़ा है कि जोड़ने, हटाने आदि विधियों को अकेले बुलाए जाने पर सामग्री फलक में स्वचालित रूप से जोड़ दिया जाता है, इसलिए getContentPane() अनावश्यक है। – Shelley

+0

मैंने कार्डलाउट का उपयोग करने की कोशिश की और यह अब पूरी तरह से काम करता है (कार्डलाउट एक आसान समाधान साबित हुआ)। आपके सहयोग के लिए धन्यवाद। – Shelley

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