2010-04-18 60 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