Blackberry - 自定义EditField光标

时间:2010-04-18 12:10:13

标签: blackberry java-me

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

4 个答案:

答案 0 :(得分:4)

我没有收到你的问题但是。

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

    BasicEditField editField = new BasicEditField(BasicEditField.NO_NEWLINE);

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

    editField.setCursorPosition(偏移);

答案 1 :(得分:3)

您可以将光标绘制到想要重写editField的onFocus方法的位置。

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

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

希望它有所帮助。

答案 2 :(得分: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());
    }
} 

我这样做可以帮助别人。 继续分享您的代码。 感谢。

答案 3 :(得分:1)

如果要删除光标,可以覆盖Field的drawFocus。

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