2011-04-05 48 views
5

我有一个适合整个窗口的ContentPanel。它有一个topComponent,一个位于中心的小部件和一个bottomComponent。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()等等,但是到目前为止还没有任何运气。)

(我正在使用GWT 2.1.1与2.2.1 GXT)

+0

什么是“越来越布局的问题”是什么意思? – 2011-04-08 15:09:03

+0

@ Travis:像我的代码中的评论一样:首先buttonTwo不显示。然后,当我调用layout()时,它显示出来。但是现在“底部”按钮消失。只要手动调整窗口大小(即使只是一个像素),布局也会自行修正,即所有按钮都显示出来。 – 2011-04-08 17:50:01

回答

7

发生这种情况,因为当您将另一个组件添加到FlowLayout时,它会调整大小,从而增加其自身的高度,从而将底部组件推到可见区域下方。代码中没有缩小中间组件,使底部组件停留在原来的位置。

还有一件事是,您正在使用FitLayout for contentPanel,其中包含3个组件,FitLayout仅用于容器中只有一个组件,它应该填充其父项。

你需要考虑以下几点:

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

我的contentPanel中的FitLayout只有一个孩子:中心按钮。 “topComponent”和“bottomComponent”是分开的。那么,你改变了代码,根本不使用“setTopComponent”和“setBottomComponent” - 并且这样做,因为它不使用ContentPanel的topComponent/bottomComponent特性。 (我为解决这个问题而实施的临时解决方案与您的解决方案类似)。但是,我确实想使用topComponent/bottomComponent特性,因为它在我正在处理的项目的现有代码中的其他地方使用 - 而且布局也应该与它一起工作。 – 2011-04-11 11:40:40

+0

在现有的代码中,您是否动态地将小部件添加到顶部或底部组件?我问这是因为在contentPanel被渲染后,顶部和底部容器不参与布局。当您手动调整浏览器窗口的大小时,会调用onResize并调整高度。有一件事你可以尝试,如果你坚持使用顶部和底部组件,就是通过动态获取高度和宽度来调用面板上的设置大小方法。 – Swapnil 2011-04-11 16:51:45

+0

@Swapnil:在现有的代码中,到目前为止,向顶部/底部组件添加小部件并不是必需的。但GXT文档并没有说,你不能在那里动态地添加小部件,所以假设这是可行的。现在,通过我们的解决方法(即没有顶部/底部组件),样式有点不同(加上一些其他小问题)。原始样式可以手动模仿,但这不是一个很干净的解决方案。 /我只是尝试'contentPanel.setSize(contentPanel.getWidth(),contentPanel.getHeight());' - 不幸的工作。任何其他想法? – 2011-04-11 17:23:06

0

一旦浏览器完成渲染窗口小部件就不会呈现该组件再这样做了一遍,我们可以使用 contentPanel.layout() 或 contentPanel.layout(真) 它按照新布局重新呈现小部件。

+0

不幸的是,在我的情况下,'contentPanel.layout()'和'contentPanel.layout(true)'什么也不做。 – 2011-04-06 07:41:21

1

发生这种情况,因为在这条语句被调用的topComponentonRender事件:

contentPanel.setTopComponent(topContainer); 

然后,以后,要添加一个组件:topContainer.add(buttonTwo);。当您调整窗口大小时,将触发onRender事件,并显示您添加的按钮。解决您的问题涉及触发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

我该如何开展活动?我在contentPanel和topContainer上都尝试过'fireEvent(Events.Render)'和'fireEvent(Events.Resize)'。我也在contentPanel.getBottomComponent()上试过它。到目前为止没有工作。 – 2011-04-08 19:45:54