2011-04-05 11 views
5

के साथ लेआउट समस्याएं मेरे पास एक सामग्रीपैन है जो पूरी विंडो फिट बैठता है। इसमें एक शीर्ष कॉम्पोनेंट, केंद्र में एक विजेट है, और एक नीचे कॉम्पोनेंट है।GXT (Ext-GWT): ContentPanel

मैं लेआउट समस्याओं हो रही है, जब मैं topComponent के लिए विजेट जोड़ने की कोशिश के बाद ContentPanel एक बार गाया कर दिया गया है

public void onModuleLoad() { 

    final Viewport viewport = new Viewport(); 
    viewport.setLayout(new FitLayout()); 

    final ContentPanel contentPanel = new ContentPanel(new FitLayout()); 
    contentPanel.setHeaderVisible(false); 

    final LayoutContainer topContainer = new LayoutContainer(
      new FlowLayout()); 

    final Button buttonOne = new Button("Top:One"); 
    topContainer.add(buttonOne); 

    contentPanel.setTopComponent(topContainer); 
    contentPanel.add(new Button("Center")); 
    contentPanel.setBottomComponent(new Button("Bottom")); 

    viewport.add(contentPanel); 
    RootPanel.get().add(viewport); 

    // Later, add a second button to the topComponent ... 
    Scheduler.get().scheduleDeferred(new ScheduledCommand() { 
     @Override 
     public void execute() { 
      final Button buttonTwo = new Button("Top:Two"); 
      topContainer.add(buttonTwo); // Doesn't show up at first. 

      topContainer.layout(); // Now, buttonTwo shows up. But we have 
          // a new problem: the "Bottom" button disappears... 

      contentPanel.layout(true); // This doesn't do anything, BTW. 
     } 
    }); 
} 

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

(मैं जीडब्ल्यूटी का उपयोग कर रहा हूं GXT 2.2.1 के साथ 2.1.1।)

+0

"हो रही लेआउट समस्याओं" क्या मतलब है? –

+0

@ ट्रेविस: मेरे कोड में टिप्पणियों की तरह उल्लेख करें: पहले बटन पर दो दिखाई नहीं देते हैं। फिर, जब मैं लेआउट() को कॉल करता हूं, तो यह दिखाता है। लेकिन अब "नीचे" बटन गायब हो जाता है।जैसे ही मैं विंडो को मैन्युअल रूप से आकार देता हूं (यहां तक ​​कि केवल एक पिक्सेल), लेआउट स्वयं को सुधारता है, यानी सभी बटन दिखाए जाते हैं। –

उत्तर

7

इसका कारण यह है क्या हो रहा है जब आप FlowLayout में एक और घटक जोड़ते हैं तो यह आकार बदलता है, इस प्रकार अपनी ऊंचाई बढ़ाता है, जो दृश्य क्षेत्र के नीचे नीचे घटक को धक्का देता है। कोड में कुछ भी नहीं है जो केंद्र घटक को कम करता है, जैसे कि नीचे का घटक इसके मूल स्थान पर रहता है।

एक और बात यह है कि आप सामग्री के लिए FitLayout का उपयोग कर रहे हैं जिसमें 3 घटक होते हैं, एक फिटटायआउट का उपयोग कंटेनरों के लिए केवल एक घटक के साथ किया जाता है, जो उसके माता-पिता को भरना होता है।

आप निम्नलिखित पर विचार करने की जरूरत है:

1) का प्रयोग करें RowLayout, जो कैसे घटकों पर एक बेहतर नियंत्रण की अनुमति देता है

2 बाहर रखा जाना चाहिए) तय करें, जो घटक आप एक खड़ी जगह करने को तैयार हैं पर स्क्रॉल बार, क्योंकि आप गतिशील रूप से घटकों को जोड़ रहे हैं।

अपने वर्तमान आवश्यकता के लिए निम्न कोड पर्याप्त होना चाहिए:

public void onModuleLoad() { 
     final Viewport viewport = new Viewport(); 
     viewport.setLayout(new FitLayout()); 

//  final ContentPanel contentPanel = new ContentPanel(new FlowLayout()); 
//  contentPanel.setHeaderVisible(false); 

     final LayoutContainer topContainer = new LayoutContainer(
       new FlowLayout()); 

     final Button buttonOne = new Button("Top:One"); 
     topContainer.add(buttonOne); 
// contentPanel.setTopComponent(topContainer); 
     final LayoutContainer centerPanel = new LayoutContainer(new FitLayout()); 

     centerPanel.add(new Button("Center")); 
// contentPanel.add(centerPanel); 
     final LayoutContainer botPanel = new LayoutContainer(new FlowLayout()); 
     botPanel.add(new Button("Bottom")); 
//  contentPanel.setBottomComponent(botPanel); 

     final ContentPanel panel = new ContentPanel(); 
     panel.setHeaderVisible(false); 
     panel.setLayout(new RowLayout(Orientation.VERTICAL));  


     panel.add(topContainer, new RowData(1, -1, new Margins(4))); 
     panel.add(centerPanel, new RowData(1, 1, new Margins(0, 4, 0, 4))); 
     panel.add(botPanel, new RowData(1, -1, new Margins(4))); 

     viewport.add(panel, new FlowData(10)); 


     RootPanel.get().add(viewport); 

     // Later, add a second button to the topComponent ... 
     Scheduler.get().scheduleDeferred(new ScheduledCommand() { 
      @Override 
      public void execute() { 
       final Button buttonTwo = new Button("Top:Two"); 
       topContainer.add(buttonTwo); // Doesn't show up at first. 
       panel.layout(true); 
      } 
     }); 
} 
+0

मेरी सामग्री में फ़िटआउटआउट केवल एक बच्चा है: केंद्र बटन। "टॉपकंपोनेंट" और "नीचे कॉम्पोनेंट" अलग हैं। खैर, आपने कोड को "setTopComponent" और "setBottomComponent" का उपयोग न करने के लिए बदल दिया - और यह काम करता है, क्योंकि यह ContentPanel की शीर्ष कॉम्पोनेंट/नीचे कॉम्पोनेंट सुविधा का उपयोग नहीं करता है। (इस मुद्दे के आसपास काम करने के लिए लागू किया गया अस्थायी समाधान आपके जैसा ही है।) हालांकि, मैं शीर्ष कॉम्पोनेंट/नीचे कॉम्पोनेंट सुविधा का उपयोग करना चाहता हूं, क्योंकि यह प्रोजेक्ट के मौजूदा कोड में हर जगह उपयोग किया जाता है - और लेआउट भी इसके साथ काम करना चाहिए। –

+0

अपने मौजूदा कोड में क्या आप गतिशील रूप से शीर्ष या नीचे घटकों में विजेट जोड़ते हैं? मैं यह पूछ रहा हूं क्योंकि सामग्री के बाद शीर्ष और निचले कंटेनर लेआउट में भाग नहीं लेते हैं। जब आप ब्राउज़र विंडो का मैन्युअल रूप से आकार बदलते हैं, तो रीसाइज को कॉल किया जाता है और यह ऊंचाई समायोजित करता है। एक चीज जिसे आप कोशिश कर सकते हैं, यदि आप ऊपर और नीचे घटकों का उपयोग करने का आग्रह करते हैं तो गतिशील रूप से ऊंचाई और चौड़ाई प्राप्त करके, पैनल पर सेट आकार विधि को कॉल करना है। – Swapnil

+0

@Swapnil: मौजूदा कोड में, शीर्ष/नीचे घटक में विजेट जोड़ना अब तक आवश्यक नहीं था। लेकिन GXT दस्तावेज यह नहीं कहता है कि आप विजेट को गतिशील रूप से जोड़ नहीं सकते हैं, इसलिए यह माना गया था कि यह काम करेगा। अब, हमारे कामकाज (यानी कोई शीर्ष/नीचे घटक) के साथ, स्टाइल थोड़ा अलग है (साथ ही कुछ अन्य मामूली मुद्दे)। मूल स्टाइल को मैन्युअल रूप से अनुकरण किया जा सकता है, लेकिन यह एक बहुत ही साफ समाधान नहीं है।/मैंने बस 'contentPanel.setSize (contentPanel.getWidth(), contentPanel.getHeight()) की कोशिश की; '- दुर्भाग्य से काम नहीं करता है। कोई अन्य विचार? –

0

एक बार ब्राउज़र विजेट प्रतिपादन पूरा करता है तो फिर से करने के लिए कि घटक से नहीं चल पाएगी फिर तो हम contentPanel.layout() या contentPanel.layout (सच उपयोग कर सकते हैं) यह नए लेआउट के अनुसार विजेट को फिर से प्रस्तुत करता है। क्योंकि topComponent की onRender घटना इस बयान में लागू की जा रही है

+0

दुर्भाग्यवश, 'contentPanel.layout() 'और' contentPanel.layout (true)' मेरे मामले में कुछ भी नहीं करता है। –

1

यह क्या हो रहा है:

contentPanel.setTopComponent(topContainer); 

फिर, बाद में, आप एक घटक जोड़ रहे हैं: topContainer.add(buttonTwo);। जब आप विंडो का आकार बदलते हैं, तो onRender ईवेंट ट्रिगर होता है, और आपके द्वारा जोड़ा गया बटन दिखाता है। आपकी समस्या का समाधान ईवेंट topContainer के लिए ट्रिगर करना शामिल है।

दुर्भाग्य से, onRender सुरक्षित है और इसलिए आप इसे सीधे फोन नहीं कर सकते हैं: http://dev.sencha.com/deploy/gxtdocs/com/extjs/gxt/ui/client/widget/LayoutContainer.html#onRender%28com.google.gwt.user.client.Element,%20int%29

आप fireEvent उपयोग करने के लिए इस ट्रिगर करना चाहते हैं जाएगा प्रोग्राम के रूप में के बजाय मैन्युअल रूप से विंडो का आकार बदलने की: http://dev.sencha.com/deploy/gxtdocs/com/extjs/gxt/ui/client/widget/Component.html#fireEvent%28com.extjs.gxt.ui.client.event.EventType%29

+0

मैं घटना को कैसे ठीक से फायर करूं? मैंने सामग्री पर 'fireEvent (Events.Render) 'और' fireEvent (Events.Resize)' की कोशिश की, दोनों चैनल और टॉपकेंटर पर। मैंने सामग्री पर भी कोशिश की Panel.getBottomComponent()। अभी तक काम नहीं किया था। –

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