2012-07-17 76 views
3

我尝试过在SWT一个Text绘制边框...
这就是我现在:借鉴文本组件外框

公共类BorderedText扩展文本{

public BorderedText(Composite parent, int style) { 
    super(parent, style); 
    addPaintListener(new PaintListener() { 

     @Override 
     public void paintControl(PaintEvent e) { 
      e.gc.setAntialias(SWT.ON); 
      if (isFocusControl()) { 
       Color color = new Color(getDisplay(), new RGB(82, 168, 236)); 
       e.gc.setAlpha(200); 
       e.gc.setForeground(color); 
       Rectangle rect = new Rectangle(0,0, getClientArea().width-1, getClientArea().height-1); 

       Transform t = new Transform(getDisplay()); 
       e.gc.setTransform(t); 

       e.gc.drawRoundRectangle(0, 0, rect.width, rect.height, 4,4); 
      } else { 
       e.gc.setForeground(SWTResourceManager.getColor(SWT.COLOR_GRAY)); 
       Rectangle rect = new Rectangle(0,0, getClientArea().width-1, getClientArea().height-1); 

       e.gc.drawRectangle(rect); 
      } 
     } 
    }); 

当组件接收焦点,他就是这个样子 enter image description here

但是,当我输入的时候,他得到了搞砸了 enter image description here

我错过了什么?

编辑
我放弃了TextStyledText

公共类BorderedText做了延伸StyledText {

public BorderedText(Composite parent) { 
    super(parent, SWT.WRAP); 

    setTabStops(new int[] {0}); 
    addPaintListener(new PaintListener() { 

     @Override 
     public void paintControl(PaintEvent e) { 
      e.gc.setAntialias(SWT.ON); 
      if(isFocusControl()){ 
       e.gc.setForeground(SWTResourceManager.getColor(SWT.COLOR_LIST_SELECTION)); 
       e.gc.drawRoundRectangle(0, 0, getClientArea().width-1, getClientArea().height-1, 6,6); 
      } else { 
       e.gc.setForeground(SWTResourceManager.getColor(SWT.COLOR_GRAY)); 
       e.gc.drawRoundRectangle(0, 0, getClientArea().width-1, getClientArea().height-1, 6,6); 
      } 
     } 
    }); 

    addFocusListener(new FocusListener() { 

     @Override 
     public void focusLost(FocusEvent e) { 
      redraw(); 
     } 

     @Override 
     public void focusGained(FocusEvent e) { 
      redraw(); 
     } 
    }); 

    addControlListener(new ControlListener() { 

     @Override 
     public void controlResized(ControlEvent e) { 
      redraw(); 
     } 

     @Override 
     public void controlMoved(ControlEvent e) { 
      redraw(); 
     } 
    }); 

addKeyListener(new KeyAdapter() { 
     @Override 
     public void keyPressed(KeyEvent e) { 
      if(e.character == SWT.TAB){ 
       e.doit = false; 
       traverse(SWT.TRAVERSE_TAB_NEXT); 
      } 
     } 
    }); 
} 

@Override 
protected void checkSubclass() { 
    // 
} 

@Override 
protected void checkWidget() { 
    // 
} 

回答

4

你有两种可能性:

  1. 你可以创建一个新的文本小部件SWT.BORDER作为风格参数。这会给你一个漂亮的边框。

  2. 您可以使用StyledText小部件。 StyledText小部件使您可以定义边距。

+0

当我使用SWT.BORDER我不能得出我自己的边界,我不希望使用StyledText – 2012-07-17 12:59:05

+0

那么有什么理由不使用StyledText? – 2012-07-17 13:04:05

+0

您是否尝试在复合材料中包装文本小部件?你可以在Composite上绘制你的边框。 – 2012-07-17 13:11:00