2008-10-20 10 views
38

इसे सरल रखने के लिए, एक साधारण जावा स्विंग ऐप है जिसमें इसमें कुछ घटकों के साथ जेएफआरएएम शामिल है। घटकों में से एक एक जेपीनल है जिसे उपयोगकर्ता कार्रवाई पर किसी अन्य जेपीनल द्वारा प्रतिस्थापित किया जाना है।मैं जेपीएनल को फ्लाई पर जेएफआरएएम के अंदर कैसे बदलूं?

तो, ऐसी चीज करने का सही तरीका क्या है? मैंने कोशिश की है

panel = new CustomJPanelWithComponentsOnIt(); 
parentFrameJPanelBelongsTo.pack(); 

लेकिन यह काम नहीं करेगा। आप क्या सुझाव देंगे?

उत्तर

47

आपका उपयोग केस CardLayout के लिए बिल्कुल सही लगता है।

कार्ड लेआउट में आप एक ही स्थान पर कई पैनल जोड़ सकते हैं, लेकिन फिर एक पैनल में एक पैनल दिखाएं या छिपाएं।

+3

कार्डलाउट का उपयोग करते समय, ध्यान रखें कि पैनल का उपयोग करने वाले पैनल के लिए पसंदीदा आकार लेआउट में सबसे बड़े पैनल का आकार होगा। यदि आप स्पेस को पुनः दावा करना चाहते हैं, तो आप घटक को छिपाने के लिए सेट विज़िबल (झूठा) और सेट प्रीफेरड साइज (नया आयाम (0,0)) का उपयोग करना चाहेंगे। –

+0

मैंने पहले कार्डलाउट के बारे में नहीं सुना था। धन्यवाद - मुझे ऐसा करने के लिए बिल्कुल सही था। – I82Much

+0

हां। यह सही तरीका है। शायद सबसे अच्छा। – FaithReaper

17
frame.setContentPane(newContents()); 
frame.revalidate(); // frame.pack() if you want to resize. 

याद रखें, जावा उपयोग 'मूल्य संदर्भ प्रतिलिपि' तर्क का उपयोग करते हैं। तो संदर्भ के एक परिवर्तनीय वेंट परिवर्तन प्रतियों को बदलना अन्य तरीकों से पारित किया।

यह भी ध्यान दें कि JFrame उपयोगिता के नाम पर बहुत भ्रमित है। एक घटक जोड़ना या लेआउट सेट करना (आमतौर पर) सामग्री फलक पर ऑपरेशन करता है। विचित्र रूप से पर्याप्त, लेआउट प्राप्त करना वास्तव में आपको फ्रेम का लेआउट प्रबंधक देता है।

+0

टॉम, के लिए धन्यवाद करने की आवश्यकता आपके उत्तर। मैं कंटेंटपेन को प्रतिस्थापित करने का लक्ष्य नहीं रख रहा हूं, बस उस पर एक jpanel रखा गया है (जैसे frame.add (jpanel1), frame.add (jpanel2), फ्रेम।जोड़ने (jpanel3))। क्या आप कोड में एक सेन समाधान का सुझाव दे सकते हैं? – yanchenko

+0

अरे जॉन, आपका उपयोग केस, कार्डलेआउट के लिए बिल्कुल सही लगता है। http://java.sun.com/docs/books/tutorial/uiswing/layout/card.html कार्ड लेआउट में आप एक ही स्थान पर कई पैनल जोड़ सकते हैं, लेकिन फिर एक पैनल को दिखाएं या छुपाएं पहर। –

+0

@swapnonil: इसे एक उत्तर दें ताकि मैं इसे वोट दे सकूं। :) –

0

मैं आपको फ्रेम निर्माण पर दोनों पैनल जोड़ने का सुझाव देता हूं, फिर दृश्यमान पैनल को दोनों पर सेट (दृश्य/सत्य) को कॉल करके बदलें। सेट दृश्य को कॉल करते समय, माता-पिता को अधिसूचित किया जाएगा और खुद को पुनर्निर्मित करने के लिए कहा जाएगा।

22

1) पहले पैनल की स्थापना:

JFrame frame=new JFrame(); 
frame.getContentPane().add(new JPanel()); 

2) पैनल की जगह:

frame.getContentPane().removeAll(); 
frame.getContentPane().add(new JPanel()); 

भी ध्यान दें कि आप घटना के सूत्र में ऐसा करना होगा, इस का उपयोग सुनिश्चित करने के लिए SwingUtilities.invokeLater या SwingWorker

1

अन्य व्यक्तियों ने इस प्रश्न का उत्तर दिया। मैं सुझाव देना चाहता हूं कि आप सामग्री को बदलने के बजाय एक JTabbedPane का उपयोग करें। एक सामान्य नियम के रूप में, आपके आवेदन के दृश्य तत्व गायब हो जाते हैं या अन्य सामग्री द्वारा प्रतिस्थापित किया जाना बुरा होता है। निश्चित रूप से प्रत्येक नियम के अपवाद हैं, और केवल आप और आपका उपयोगकर्ता समुदाय सर्वश्रेष्ठ दृष्टिकोण का निर्णय ले सकते हैं।

3

यह सब इस बात पर निर्भर करता है कि इसका उपयोग कैसे किया जा रहा है। यदि आप इन दो पैनलों के बीच आगे और पीछे स्विच करना चाहते हैं तो कार्डलाउट का उपयोग करें। यदि आप केवल पहले से दूसरे में स्विच कर रहे हैं और (और वापस नहीं जा रहे हैं) तो मैं telcontar के सुझाव का उपयोग करूंगा और बस इसे प्रतिस्थापित कर दूंगा। यद्यपि यदि आपके फ्रेम में जेपीनल एकमात्र चीज नहीं है, तो मैं हटाने के बजाय remove(java.awt.Component) का उपयोग करूंगा।

यदि आप इन दोनों मामलों के बीच कहीं हैं तो मूल रूप से एक समय-स्थान व्यापार। कार्डलाउट आपको समय बचाएगा लेकिन इस पूरे अन्य पैनल को हर समय याद रखने के लिए और अधिक मेमोरी लेगा। लेकिन अगर आप जरूरत पड़ने पर पैनल को प्रतिस्थापित करते हैं और इसे मांग पर बनाते हैं, तो आपको उस घोर को चारों ओर रखना नहीं है, लेकिन स्विच करने में अधिक समय लगता है।

इसके अलावा, आप एक JTabbedPane बजाय टैब का उपयोग करने के लिए कोशिश कर सकते हैं (अपने CardLayout से भी आसान है क्योंकि यह दिखाने/automitically छुपा संभालती)

5

उपयोगकर्ता कार्रवाई पर:

// आप कुछ के साथ क्या करना है

myJFrame.getContentPane().removeAll() 
myJFrame.getContentPane().invalidate() 

myJFrame.getContentPane().add(newContentPanel) 
myJFrame.getContentPane().revalidate() 

फिर आप आवश्यकतानुसार अपने wndow का आकार बदल सकते हैं।

6

आशा है कि कोड का यह टुकड़ा आपको जेएफआरएएम के अंदर जेपीनल बदलने का विचार देगा।

public class PanelTest extends JFrame { 

     Container contentPane; 

     public PanelTest() { 
      super("Changing JPanel inside a JFrame"); 
      contentPane=getContentPane(); 
     } 

     public void createChangePanel() { 
      contentPane.removeAll(); 
      JPanel newPanel=new JPanel(); 
      contentPane.add(newPanel); 
      System.out.println("new panel created");//for debugging purposes 
      validate(); 
      setVisible(true); 
     } 
} 
1

मुझे बिल्कुल वही समस्या थी !! Increadible !! मुझे मिला समाधान:

  1. कंटेनर में सभी घटकों (जेपीनेल) को जोड़ना;
  2. उन सभी के लिए सेट दृश्य (गलत) विधि का उपयोग करना;
  3. उपयोगकर्ता कार्रवाई पर, पैनल को सेट करने योग्य (सत्य) सेट करना मैं शो चाहता था।
// Hiding all components (JPanels) added to a container (ex: another JPanel) 
for (Component component : this.container.getComponents()) { 
     component.setVisible(false); 
}
// Showing only the selected JPanel, the one user wants to see 
panel.setVisible(true); 

कोई पुनः सत्यापित(), कोई सत्यापित करें(), कोई CardLayout की जरूरत है।

0
class Frame1 extends javax.swing.JFrame { 

    remove(previouspanel); //or getContentPane().removeAll(); 

    add(newpanel); //or setContentPane(newpanel); 

    invalidate(); validate(); // or ((JComponent) getContentPane()).revalidate(); 

    repaint(); //DO NOT FORGET REPAINT 

} 

कभी-कभी आप पुनर्वैधीकरण का उपयोग किए बिना काम कर सकते हैं और कभी-कभी repaint.My सलाह उपयोग दोनों का उपयोग किए बिना।

0

समस्या: मेरा घटक कंटेनर में जोड़ने के बाद प्रकट नहीं होता है।

आप एक घटक जोड़ने के बाद revalidate और repaintआह्वान करने के लिए इससे पहले कि यह अपने कंटेनर में दिखाई देगा की जरूरत है।

स्रोत: http://docs.oracle.com/javase/tutorial/uiswing/layout/problems.html

0

बस विधि पैक (ContentPane सेट करने के बाद, (, शायद पुराने java 1.7) इस तरह कहते हैं):

JFrame frame = new JFrame(); 
JPanel panel1 = new JPanel(); 
JPanel panel2 = new JPanel(); 
.... 
frame.setContentPane(panel1); 
frame.pack(); 
... 

frame.setContentPane(panel2); 
frame.pack(); 
... 
-1

आप उपयोग कर सकते हैं एक लेआउट की विधि की जगह :

layout.replace(existingComponent, newComponent) 

मौजूदा और नए घटक जेपीनल भी हो सकते हैं।

1

layout.replace() उत्तर समूहLayout प्रबंधक पर केवल मौजूद/काम करता है।

अन्य LayoutManagers (CardLayout, BoxLayout आदि) इस सुविधा का समर्थन नहीं है, लेकिन पहले RemoveLayoutComponent (और फिर AddLayoutComponent (फिर से वापस। [रिकॉर्ड सीधे बस की स्थापना] :-)

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