2012-02-07 13 views
5

से यहाँ समस्या को समझाने कोड की runnable टुकड़ा है।
यह माइगलाउट से संबंधित प्रतीत नहीं होता है (मैं इसका उपयोग कर रहा हूं) क्योंकि मैं डिफ़ॉल्ट लेआउट के साथ एक ही व्यवहार को देखता हूं।गतिशील रूप से हटाने के घटक JPanel


import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

import net.miginfocom.swing.MigLayout; 

public class MyFrame2 extends JFrame { 
    private JPanel main; 
    private JPanel s1; 
    private JPanel s2; 
    private JPanel s3; 

    public static void main(String[] args) throws InterruptedException { 
     MyFrame2 f = new MyFrame2(); 
     f.setVisible(true); 
     Thread.sleep(2000); //you can see all three panels for two seconds 

     f.main.remove(f.s1); 
     f.main.validate(); 
     Thread.sleep(2000); 
     f.main.remove(f.s2); 
     f.main.validate(); 
     Thread.sleep(2000); 
     f.main.remove(f.s3); 
     f.main.validate(); 
    } 

    public MyFrame2() { 
     main = new JPanel(); 

     main.setLayout(new MigLayout()); 

     main.add(new JLabel("Why does s3 not disappear?"),"w 200, h 100, wrap"); 

     s1 = new JPanel(); 
     s1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY,1),"s1")); 
     main.add(s1,"w 90%, h 300, wrap"); 

     s2 = new JPanel(); 
     s2.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY,1),"s2")); 
     main.add(s2,"w 90%, h 300, wrap"); 

     s3 = new JPanel(); 
     s3.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY,1),"s3")); 
     main.add(s3,"w 90%, h 300, wrap"); 

     getContentPane().setLayout(new BorderLayout()); 
     getContentPane().add(main, BorderLayout.CENTER); 

     setSize(new Dimension(800, 600)); 

    } 
} 

उत्तर

11

कॉल, पिछले f.validate() के बाद:

f.repaint(50L); 

पिछले सत्यापित नये नोट्स परिवर्तन नहीं करता है के रूप में।

+0

धन्यवाद। यह काम करता हैं! (+1)। क्या आप कृपया थोड़ा विस्तार कर सकते हैं? आखिरी मान्यता पिछले सभी मान्यताओं के दौरान लेआउटिंग क्यों नहीं बदलती है? (स्पष्ट रूप से मैं बहुत स्विंग विकास नहीं करता!) –

+2

आखिरी मान्य * करता है * लेआउट बदलता है - आप बस इसे नहीं देखते हैं। अंतिम घटक को कॉल करने के बाद वास्तव में हटा दिया गया है, लेकिन इस निष्कासन के दृश्य प्रमाण को देखने के लिए आपको घटक को पुन: पेश करने की आवश्यकता है। –

+0

@ होवरक्राफ्टफुलऑफेल: धन्यवाद। –

5

पहले, स्विंग जीयूआई वस्तुओं का निर्माण किया जाना चाहिए और event dispatch thread पर चालाकी से केवल, लेकिन आप EDT पर सो नहीं होना चाहिए। here दिखाए गए अनुसार, समय चिह्नित करने के लिए javax.swing.Timer का उपयोग करें। अंत में

+0

धन्यवाद। यह –

+1

@amol समस्या को प्रदर्शित करने के लिए बस एक त्वरित हैक था: भाई घटकों को प्रभावित, आकार बदल दिया गया था, और सत्यापन में फिर से खींचा जाना था। अंतिम घटक इस तरह के redrawing ट्रिगर नहीं किया था। (इस टिप्पणी का खेद गलत स्थान) –

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