强制ContentPanel重新布局其组件

时间:2013-05-29 13:45:14

标签: gwt gxt

我实现了一个带有BorderLayoutContainer和2 ContentPanel的水平可拆分面板:

--------------------------------------------------
|  ContentPanel 1           |  ContentPanel2     |
|                           |                    |
| component 1 - component 2 |                    |
|                         <-|->                  |
|                           |                    |
|                           |                    |
--------------------------------------------------

使用此代码:

public class WestCenter extends BorderLayoutContainer {

  private ContentPanel westPanel;
  private ContentPanel centerPanel;

  public WestCenter(){
    westPanel = new ContentPanel();
    centerPanel = new ContentPanel();

    BorderLayoutData westData=new BorderLayoutData(800);
    westData.setSplit(true);
    westData.setCollapsible(true);
    westData.setMinSize(300);
    westData.setMaxSize(2000);
    westData.setMargins(new Margins(0,5,0,0));

    BorderLayoutData centerData=new BorderLayoutData();
    setWestWidget(westPanel, westData);
    setCenterWidget(centerPanel,centerData);
  }
  ...
  //Getters, Setters etc...

}

问题:

当用户拖动栏以使“组件1”和“组件2”不再适合同一行时,高度计算会出现一些问题,导致显示不良。

--------------------------------------------------
|  ContentPanel 1  |        ContentPanel2        |
|                  |                             |
| component 1      |                             |
| component 2    <-|->                           |
|                  |                             |
| *bad display for |                             |
| compos here*     |                             |
--------------------------------------------------

但是

如果我手动重新划分1px,显示效果再次良好(即使2行上有“组件1”和“组件2”)。

问题

如何强制ContentPanel重新显示其内容?

到目前为止,我发现的唯一方法是(非常)丑陋:在contentPanel上添加一个resize处理程序,将width设置为width-1。

问题是这个处理程序生成另一个resize事件,导致无限循环。但是在Timer的帮助下,我验证了显示问题是通过这种宽度变化来解决的:

westPanel.addResizeHandler(new ResizeHandler() {
  @Override
  public void onResize(final ResizeEvent event) {
    Timer t=new Timer(){
      @Override
      public void run() {
        westPanel.setWidth(westPanel.getOffsetWidth()-1);
      }
    };
    t.schedule(2000);
  }
});

有什么想法吗?

0 个答案:

没有答案