2013-03-06 8 views
5

मैं एक रिश्तेदार के लिए एक सरल थोड़ा स्विंग आवेदन पर काम कर रहा हूँ का आकार बदलने, लेकिन मैं मुसीबत उस पर एनिमेशन को लागू हो रही है ...जावा घुमाओ GridBagLayout पैनल मुद्दों

यहाँ मेरी लेआउट का वर्णन है:

मेरे पास एक मुख्य विंडो है (तत्काल, पैकिंग और जेएफआरएएम प्रदर्शित करके बनाई गई)। मैंने मुख्य विंडो के सामग्री पैनल को इसके लेआउट के रूप में ग्रिडबैगलाउट का उपयोग करने के लिए कहा है। मेरा ग्रिड 2 ग्रिड चौड़ा है, और 3 ग्रिड लंबा है। पहले कॉलम में मेरे पास तीन जेबुटन (ए, बी, और सी) हैं, प्रत्येक एक लंबवत ग्रिड स्पेस की एक पंक्ति लेता है, और क्षैतिज ग्रिड स्पेस का एक कॉलम लेता है। दूसरे कॉलम में, मेरे पास एक और जेपीनल है, जो एक कॉलम चौड़ा है, और तीन पंक्तियां लंबी हैं।

यह दूसरा जेपीनेल भी इसके लेआउट के रूप में ग्रिडबैगलाउट का उपयोग करने के लिए सेट है। इस मामले में, दो कॉलम और एक पंक्ति हैं। बाएं कॉलम में एक कॉलम चौड़ा है, एक पंक्ति लंबा जेपीनल इसके अंदर बटन 1 के साथ है। दाएं कॉलम में केवल एक ही जेबटन (बटन 2) होता है, जो एक स्तंभ चौड़ा होता है, और एक पंक्ति लंबा होता है।

यहाँ मैं सिर्फ क्या वर्णित का एक स्क्रीनशॉट है:

मैं कोशिश कर रहा है: Image of Layout

अब आप समझते हैं कि क्या लेआउट है, मुझे समझाने मैं क्या करने की कोशिश कर रहा है क्या करते हैं Universal Tween Engine उपयोग करने के लिए JPanel जो बटन 1. शामिल लेकिन, मेरा प्रयास में आकार बदलने के लिए, मैं एक परिणाम के रूप में इस मिल:

enter image description here

आप के रूप में शायद देख सकते हैं, जेपीनेल जिसमें बटन 1 है सफलतापूर्वक आकार बदल गया है! हालांकि, बटन 2 का आकार और स्थिति बिल्कुल नहीं बदली है, और वास्तव में, बटन 2 जेपीनेल द्वारा बटन 1 को काट रहा है!

यह एक समस्या है, क्योंकि मुझे उम्मीद है कि जेपीनेल में बटन 1 युक्त आकार बदलने के साथ-साथ इसके ग्रिडबैगआउट के सेल आकार को बदलना होगा। मुझे इस मामले पर गलती से गलत लगा, ऐसा लगता है।

तो यह मुझे मेरे प्रश्न पर लाता है ... मुझे अपने ग्रिडबैगआउट के "अपडेट" करने के लिए क्या करने की आवश्यकता है ताकि यह बटन 1 युक्त जेपनेल से आकार में वृद्धि को समायोजित करने के लिए अपने ग्रिड का आकार बदल सके? मैंने अपने ग्रिडबैगआउट पर GridBagLayout.invalidatelayout() पर कॉल करने का प्रयास किया है, और मैंने अपनी मुख्य विंडो पर JFrame.getContentPane().invalidate() पर कॉल करने का भी प्रयास किया है। ऐसा कोई प्रभाव नहीं था।

यहाँ मेरी परियोजना के compilable स्रोत कोड है:

ImageManager.java:

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 
import aurelienribon.tweenaccessors.swing.*; 
import aurelienribon.utils.swing.*; 
import aurelienribon.tweenengine.*; 
import aurelienribon.tweenengine.equations.*; 

public class ImageManager 
{ 
    /** 
    * @param args 
    */ 

    public static JFrame mainwindow; 
    public static TweenManager tweenManager; 
    public static void main(String[] args) 
    { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() //For thread safety! 
     { 
      public void run() 
      { 
       InitGUI(); 
       InitTween(); 
      } 
     }); 
    } 


    private static void InitTween() 
    { 
     ((Window)mainwindow).addWindowListener(new WindowAdapter() { 
      @Override public void windowOpened(WindowEvent e) 
      { 
        new DrawingCanvas() 
        { 
          @Override protected void update(int elapsedMillis) 
          { 
           tweenManager.update(elapsedMillis); 
          } 
        }.start(); 
      } 
     }); 
    } 


    private static void InitGUI() 
    { 
     //Init the window and layout systems 
     mainwindow = new JFrame("Imaffect"); 
     Container pane = mainwindow.getContentPane(); 
     pane.setLayout(new GridBagLayout()); 

      //Begin creating the UI! 
      pane.add(new JButton("Button A"), new GridBagConstraints(0, 0, 1, 1, 0, 1, GridBagConstraints.PAGE_START, GridBagConstraints.VERTICAL, new Insets(0,0,0,0), 100, 0)); 
      pane.add(new JButton("Button B"), new GridBagConstraints(0, 1, 1, 1, 0, 0, GridBagConstraints.PAGE_START, GridBagConstraints.VERTICAL, new Insets(0,0,0,0), 100, 100)); 
      pane.add(new JButton("Button C"), new GridBagConstraints(0, 2, 1, 1, 0, 0, GridBagConstraints.PAGE_START, GridBagConstraints.VERTICAL, new Insets(0,0,0,0), 100, 20)); 

      pane.add(InitPreviewGUI(), new GridBagConstraints(1, 0, 1, 3, 1, 1, GridBagConstraints.PAGE_START, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0, 0)); 


     //Finalize the window 
     mainwindow.pack(); 
     mainwindow.setVisible(true); 
    } 


    private static JPanel InitPreviewGUI() 
    { 
     JPanel panel = new JPanel(new GridBagLayout()); 
     panel.add(InitSettingsGUI(), new GridBagConstraints(0, 0, 1, 1, 0, 1, GridBagConstraints.PAGE_START, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0, 0)); 
     panel.add(new JButton("Button 2"), new GridBagConstraints(1, 0, 1, 1, 1, 1, GridBagConstraints.PAGE_START, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0, 0)); 


     return panel; 
    } 

    private static JPanel InitSettingsGUI() 
    { 
     JPanel panel = new JPanel(); 
      SetupSettingsTweens(panel); 
      SetupSettingsContent(panel); 
     return panel; 
    } 


    private static void SetupSettingsTweens(JPanel panel) 
    { 
     Tween.registerAccessor(Component.class, new ComponentAccessor()); 
     tweenManager = new TweenManager(); 
     Tween.to(panel, ComponentAccessor.WIDTH, 1000) 
      .target(200) 
      .ease(Cubic.INOUT) 
      .repeatYoyo(-1, 200) 
      .delay(500) 
      .start(tweenManager); 

    } 

    private static void SetupSettingsContent(JPanel panel) 
    { 
     panel.add(new JButton("Button 1")); 
    } 
} 

आप कोड अपने आप को संकलित करने के लिए चाहते हैं, तो आपको निम्न तीन संसाधनों की आवश्यकता होगी:

  1. Universal Tween Engine library jar
  2. DrawingCanvas.java (पैकेज aurelienribon.utils.swing)
  3. ComponentAccessor.java (पैकेज aurelienribon.tweenaccessors।

आप जटिल परियोजना सेटअप के बिना मेरी समस्या पहले हाथ अनुभव करने के लिए, चाहते हैं, तो आप ग्रहण जूनो परियोजना, या runnable जार फ़ाइल डाउनलोड कर सकते हैं

यदि आप डाउनलोड से दूर रहना पसंद करेंगे, तो यहां क्या हो रहा है इसकी एक सूची यहां दी गई है:

  1. एक धागा SwingUtilities.invokeAndWait का उपयोग करता है एक समारोह अद्यतन कहा जाता है() कॉल करने के लिए सेट करें ट्वीन (कुछ खास नहीं) के लिए
  2. सेट करें आवश्यकताओं को सेट करें जीयूआई संरचना
  3. जब भी अद्यतन() कहा जाता है, यह जेननेल पर आकार परिवर्तन को एनिमेट करने के लिए Container.setSize() का उपयोग करता है जिसमें बटन 1.

इस समस्या के साथ किसी भी मदद की बहुत सराहना की जाती है! धन्यवाद :)

पीएस अगर इस सवाल का डुप्लिकेट है, तो मुझे बहुत खेद है। मैं काफी हद तक गुस्से में था, लेकिन मैं अपनी समस्या से संबंधित कुछ भी नहीं ढूंढ पाया।

उत्तर

3

मैं अपने update() विधि में कह सकते हैं कि आप Button1 के पसंदीदा आकार बदलने और

container.revalidate(); 
container.repaint(); 

फोन वांछित माप और revalidate() अद्यतन लेआउट और repaint() परिवर्तन को दर्शाता है बदलने चाहिए।

वैकल्पिक रूप से आप Button1 बढ़ती चौड़ाई के लिए और Button2 के एक ही समय में कमी चौड़ाई में setSize() कॉल कर सकते हैं और फिर से (revalidate() बिना क्योंकि पुनर्वैधीकरण मूल लेआउट बहाल होगा) repaint() कहते हैं।

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