动态改变Composite中的子控件时,用layout()而非redraw() ,用CTabFolder的例子进行说明

{
  Composite topComp = null;
  // ...

  // CTabFolder
  CTabFolder tabFolder = new CTabFolder(topComp, SWT.TOP | SWT.BORDER);
  GridData gd = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
  gd.horizontalSpan = 20;
  tabFolder.setLayoutData(gd);
  tabFolder.setTabHeight(30);
  tabFolder.setSimple(true);
  tabFolder.marginHeight = 0;
  tabFolder.marginWidth = 0;
  Font font = null;
  // font = FontFactory.getFont("Arial", 8, SWT.BOLD);

  // CTabItem
  CTabItem item2 = new CTabItem(tabFolder, SWT.NULL);
  item2.setText("Pins");
  item2.setFont(font);
  // ----
  Group pinsGroup = new Group(tabFolder, SWT.FILL);
  pinsGroup.setText("Pins");
  Color color = null;
  pinsGroup.setBackground(color /* ColorFactory.getColor(255, 255, 255) */);
  pinsGroup.setLayout(new RowLayout());

  // 动态填充 pinsGroup的内容
  setDynamicData(pinsGroup);

  item2.setControl(pinsGroup);

  // ============================================

 }

 public void setDynamicData(Composite pinsGroup) {
  // 1.清除掉原来的 子控件
  Control[] controls = pinsGroup.getChildren();
  for (int i = 0; i < controls.length; i++) {
   controls[i].dispose();
  }
  // 2. 数据填充,例如:
  for (int i = 0; i < 20; i++) {
   final CLabel pinLabel = new CLabel(pinsGroup, SWT.CENTER);
   pinLabel.setText("pinLabel:"+i);
   RowData rowData = new RowData();
   rowData.height = 20;
   rowData.width =40;
   pinLabel.setLayoutData(rowData);
  }
  
  //3. layout--->这是关键(用pinsGroup.redraw();//这个还是没有效果)
  pinsGroup.layout(); 
  /*markLayout()这是源码中的真正实现,只有设置了.layout(),参数changed才为true,才有动态改变的效果
   * -----执行---->if (all) {...}分支
  void markLayout (boolean changed, boolean all) {
   if (layout != null) {
    state |= LAYOUT_NEEDED;
    if (changed) state |= LAYOUT_CHANGED;
   }
   if (all) {
    Control [] children = _getChildren ();
    for (int i=0; i<children.length; i++) {
     children [i].markLayout (changed, all);
    }
   }
  }*/
  //pinsGroup.redraw();
  /*设置.redraw()后的内部实现,参数all为false-----执行---->OS.RedrawWindow (handle, null, 0, flags);
  void redraw (boolean all) {
   if (!OS.IsWindowVisible (handle)) return;
   if (OS.IsWinCE) {
    OS.InvalidateRect (handle, null, true);
   } else {
    int flags = OS.RDW_ERASE | OS.RDW_FRAME | OS.RDW_INVALIDATE;
    if (all) flags |= OS.RDW_ALLCHILDREN;
    OS.RedrawWindow (handle, null, 0, flags);
   }
  }*/
 }

猜你喜欢

转载自niub.iteye.com/blog/1787600