2010-04-18 56 views
2

我正在为我的BlackBerry项目创建一个搜索框,但它看起来像BlackBerry没有创建单行EditField的API。我通过扩展BasicEditField和覆盖布局和绘制等方法创建了一个自定义字段。在paint函数体中,我使用getPreferredWidth()和getPreferredHeight()绘制了一个矩形。但光标显示在EditField的默认左上角位置。任何人都可以告诉我如何在我的文本所在的位置绘制光标吗?即通过调用drawText()在EditField的中间。黑莓 - 自定义EditField光标

+0

尝试重写DRAWFOCUS处理重点画 – 2010-04-19 14:26:35

回答

4

我不明白你的问题,但。

  1. 您可以创建单行编辑字段。

    BasicEditField editField = new BasicEditField(BasicEditField.NO_NEWLINE);

  2. 您可以设置光标位置。

    editField.setCursorPosition(offset);

+0

setCursorPosition将设置光标的位置,但不处理它连续战平场的中间 – 2010-04-19 14:29:39

3

您可以在希望重写editField的onFocus方法的位置绘制光标。

 protected void onFocus(int direction) { 
      super.onFocus(direction); 
      this.setCursorPosition(this.getTextLength()); 
      invalidate(); 
     } 

获得焦点后,该字段将光标定位在文本的末尾。 editField具有setCursorPosition和getTextLength。

希望它有帮助。

2

谢谢大家,我从Blackberry Journal获得了一个很好的解决方案。

public class ScrollingSearchBox extends HorizontalFieldManager 
{ 
    private int managerWidth; 
    private int managerHeight; 
    public ScrollingSearchBox() 
    { 
     super(Manager.NO_HORIZONTAL_SCROLL); 
     searchEdit = new BasicEditField(){ 
      public int getPreferredHeight() 
      {     
       return ret; 
      } 
      public int getPreferredWidth() 
      {      
       return ret; 
      } 
      public void paint(Graphics g) 
      { 
       getManager().invalidate(); 
       super.paint(g);      
      } 
     }; 

     HorizontalFieldManager hfm = new HorizontalFieldManager(Manager.HORIZONTAL_SCROLL) 
     { 
      public void sublayout(int width, int height) 
      { 
       if (managerWidth == 0) { 
        managerWidth = searchEdit.getPreferredWidth(); 
       } 
       if (managerHeight == 0) { 
        managerHeight = searchEdit.getPreferredHeight(); 
       } 
       super.sublayout(managerWidth, managerHeight); 
       setExtent(managerWidth,managerHeight); 
      } 
      public void paint(Graphics g) { 
       super.paint(g); 
      } 
     }; 
     searchEdit.setMaxSize(70); 
     hfm.add(searchEdit); 
     add(hfm); 
    } 

    public int getPreferredHeight() 
    { 
     int ret = 0;    
     return ret; 
    } 
    protected void sublayout(int maxWidth, int maxHeight) 
    { 
     int currX = 0; 
     int currY = 0; 
     Field currField; 

     currField = this.getField(0); 
     switch (ScreenConfig.getInstance().getScreen()) 
     { 
      case ScreenConfig.SCREEN_320_240: 
      currX = 5; 
      currY = 3; 
      break; 
      case ScreenConfig.SCREEN_480_360: 
      case ScreenConfig.SCREEN_480_320: 
      currX = 5; 
      currY = 1; 
      break; 
     } 
     this.setPositionChild(currField, currX, currY); 
     this.layoutChild(currField, currField.getPreferredWidth(), 
     currField.getPreferredHeight()); 
     setExtent(this.getPreferredWidth(), this.getPreferredHeight()); 
    } 

    protected void paint(Graphics graphics) 
    { 
     super.paint(graphics); 
     graphics.drawRect(0, 0, this.getPreferredWidth(), this.getPreferredHeight()); 
    } 
} 

我给这个所以它可以帮助别人。 继续分享您的代码。 谢谢。

1

如果你想删除光标,你可以重写字段的drawFocus。

protected void drawFocus(Graphics graphics, boolean on) {} // remove cursor