读书人

动态改变Composite中的子控件时用la

发布时间: 2013-02-19 11:11:40 作者: rapoo

动态改变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);   }  }*/ }

读书人网 >操作系统

热点推荐