为Form中的控件添加漂亮的边框

万俟经纶
2023-12-01
今天把机子显示模式调到 "Windows经典",发现 Form 中的 Text, Table 等控件都没有了边框,变成了空白。

而把创建控件的代码,加上 SWT.BORDER,显示的是三维凹陷的边框,不符合我的要求,我想要 PDE 那样的效果。

查看 Eclipse 源码,发现以下段:

java 代码
 
  1. public class FormToolkit {  
  2.     ...  
  3.     private class BorderPainter implements PaintListener {  
  4.         public void paintControl(PaintEvent event) {  
  5.             Composite composite = (Composite) event.widget;  
  6.             Control[] children = composite.getChildren();  
  7.             for (int i = 0; i < children.length; i++) {  
  8.                 Control c = children[i];  
  9.                 ...  
  10. ...  

这一段是对 composite 中的控件进行边框的绘制,可是对哪些 Composite 进行绘制呢?
于是, 看一下引用 BorderPainter 的地方,见到如下代码:

java 代码
 
  1. public void paintBordersFor(Composite parent) {  
  2.     // if (borderStyle == SWT.BORDER)  
  3.     // return;  
  4.     if (borderPainter == null)  
  5.         borderPainter = new BorderPainter();  
  6.     parent.addPaintListener(borderPainter);  
  7. }  

哈哈, 以后不要忘记要给相应的parent composite调用一下以上方法。


java 代码
  1. toolkit.paintBordersFor(container);    

 
还有 Form 中的 Tree, Table 等控件, 如果不是通过 toolkit 方式构建的,要为它们加上 toolkit.getBorderStyle(), 因为操作系统的差异性,所以 toolkit.getBorderStyle() 对进行了特别处理

java 代码
 
  1. // in FormToolkit.class  
  2.        private void initializeBorderStyle() {  
  3.     String osname = System.getProperty("os.name"); //$NON-NLS-1$  
  4.     if (osname.equals("Windows XP")) { //$NON-NLS-1$  
  5.         // Skinned widgets used on XP - check for Windows Classic  
  6.         // If not used, set the style to BORDER  
  7.         RGB rgb = colors.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);  
  8.         if (rgb.red != 212 && rgb.green != 208 && rgb.blue != 200)  
  9.             borderStyle = SWT.BORDER;  
  10.     } else if (osname.startsWith("Mac")) //$NON-NLS-1$  
  11.         borderStyle = SWT.BORDER;  
  12. }  

所以...
java 代码
 
  1. tableViewer = new TableViewer(container,
      1. toolkit.getBorderStyle() | SWT.FULL_SELECTION | SWT.HIDE_SELECTION);  
 类似资料: