2011-04-27 10 views
5

क्या कोई यह समझा सकता है कि निम्नलिखित क्यों काम नहीं करता है?हटाएं अगले सत्यापन पर हटाएंगे?

बटन केवल (खाली) jScrollPane युक्त, यानी इनपुट क्षेत्र और बटन गायब हो जाना चाहिए प्रदर्शन में 'चाहिए' परिणाम दबाने। हालांकि वे घटक का आकार बदलने तक रहते हैं ...

public static void main(String[] args) 
{ 
    JFrame frame = new JFrame("test"); 
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    final JPanel panel = new JPanel(); 

    Container cp = frame.getContentPane(); 
    cp.setLayout(new FlowLayout()); 
    cp.add(new JScrollPane(panel)); 

    Component textField = new JTextField("i am input"); 
    JButton button = new JButton(new AbstractAction("i am pressy") 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      // this is already on the EDT 
      panel.removeAll(); 
      panel.revalidate(); 
     } 
    }); 

    panel.setLayout(new FlowLayout()); 
    panel.add(textField); 
    panel.add(button); 

    frame.pack(); 
    frame.setVisible(true); 
} 

आपकी मदद के लिए धन्यवाद। पी।

+2

इसके बजाए 'panel.repaint()' कोशिश करें? – Jeremy

+1

अच्छा [एसएससीईएस] (http://sscce.org/)। – trashgod

उत्तर

18

एक दृश्य जीयूआई को अपडेट करते समय कोड होना चाहिए:

panel.revalidate(); 
panel.repaint(); // sometimes needed, this appears to be one of them 
2

आप @ जेरेमी द्वारा टिप्पणी में निर्दिष्ट अनुसार panel.repaint() निष्पादित कर सकते हैं, हालांकि, जब भी आप विंडो का आकार बदलते हैं तो यूआई तब भी बदल जाएगा। कारण यह है कि जेपीनल से तत्वों को हटाने से पैनल का आकार बदल जाएगा। एक पुन: ऑपरेशन ऑपरेशन पैनल को तब तक आकार देने का कारण नहीं बनता जब तक कि जेएफआरएएम अपने लेआउट को फिर से जांच नहीं लेता (जैसा कि विंडो का आकार बदलता है)।

सुनिश्चित करें कि लेआउट सही ढंग से एक परिवर्तन पर बाहर रखी गई है, आप frame.validate() कॉल कर सकते हैं। इस ऑपरेशन से जेएफआरएम खुद को और सभी बाल घटकों को पुन: वैध कर देगा, जो एक ही ऑपरेशन है जो खिड़की के आकार के आयोजन के दौरान हो रहा है। अपने कोड में इस पद्धति पर अमल करने के लिए आप, अंतिम, यानी करने के लिए JFrame frame बदलना होगा

final JFrame frame = new JFrame("test"); 
+0

मुझे नहीं लगता कि निकालने वाले ट्रिगर्स का आकार बदलना; मुझे लगता है कि अभिभावक विंडो के 'घटक लिस्टर' के माध्यम से ट्रिगर्स 'repaint() 'का आकार बदलना। विंडो के 'विंडो लिस्टर' के माध्यम से स्विचिंग एप्लिकेशन भी काम करता है। साथ ही, मैं आपके 'frame.validate() 'परिणाम को पुन: उत्पन्न नहीं कर सकता जब तक कि मैं कुछ घटक का आकार, स्थान या लेआउट भी बदल नहीं जाता। – trashgod

+0

@trashgod या नहीं, जैसा कि आप देख एक अतिरिक्त आकार (उर्फ: क्रिस ' "लेआउट सही ढंग से बाहर रखी") है या नहीं, पैनल एक माता पिता जो validationRoot है (शीर्ष-स्तर के नीचे) पर निर्भर करता है। पूरी तरह से यकीन है कि लेआउट शीर्ष स्तर के कंटेनर के सभी में फिर से मूल्यांकन किया जाता है, कि कंटेनर (जो भी सर्वोच्च validationRoot है) मान्य होना करने के लिए – kleopatra

+2

की कोई आवश्यकता नहीं जाने का रास्ता है करने के लिए एक (अंतिम या अन्यथा) संदर्भ के लिए फ्रेम - SwingUtilities.windowForComponent अपने दोस्त :-) – kleopatra

9

revalidate() विधि करने की जरूरत के रूप में घटकों के निशान बाहर रखा जाना चाहिए, लेकिन जब तक कुछ repaint() ट्रिगर नहीं करता है तो आपको कोई परिवर्तन दिखाई नहीं देगा। पैरेंट विंडो का आकार बदलना एक ऐसा ट्रिगर है; स्विचिंग अनुप्रयोग एक और है। इस पिछले version में, ध्यान दें कि पैनल पर setSize()repaint() की आवश्यकता को रोकता है। इसी तरह, यह exampleresetGame() में लेआउट को बदलता है।

लेख Painting in AWT and Swing और अधिक विस्तार में चला जाता है।

import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.WindowConstants; 

/** @see https://stackoverflow.com/questions/5812002 */ 
public class RevalidateTest { 

    private static JPanel panel = new JPanel(); // default FlowLayout 
    private static JTextField text = new JTextField("Text field"); 
    private static JButton clear = new JButton(new AbstractAction("Clear") { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      panel.removeAll(); 
      panel.add(reset); 
      panel.revalidate(); 
      panel.repaint(); 
     } 
    }); 
    private static JButton reset = new JButton(new AbstractAction("Reset") { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      panel.removeAll(); 
      panel.add(text); 
      panel.add(clear); 
      panel.revalidate(); 
      panel.repaint(); 
     } 
    }); 

    static void createAndShowGUI() { 
     JFrame frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     panel.add(text); 
     panel.add(clear); 
     frame.add(panel); // default BorderLayout center 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

भी देखें [ 'DynamicLayout'] (है http://stackoverflow.com/questions/5750068/java-swing-how-to-change-gui-dynamically/5751044#5751044)। – trashgod

+0

लेकिन फिर, कौन सा सॉन एप्लिकेशन कोड कभी भी सेटसाइज को कॉल करेगा ;-) यह एक और ट्रिगर है जो पुनर्निर्मित करने के लिए एक घटक कतार देता है, इसलिए विचलन से सीधे पथ तक बेहतर छड़ी। – kleopatra

+0

@ क्लेओपात्रा: काफी सही; नलसाजी को उजागर करने के लिए सिर्फ एक उदाहरण है। अद्यतन कर रहा है ... – trashgod

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