2012-06-08 2 views
0

Я создал собственное поле редактирования с закругленной границей. Но курсор отображается в верхней части CustomEditField. Как изменить положение курсора в центр поля. Нужна помощь по этой проблеме. Следующим фрагментом кода является реализация CustomEditField.Как установить положение курсора в середине CustomEditField?

public CustomEditField() { 
    this(0); 
    setMaxSize(15); 
    setCursorPosition(AXIS_VERTICAL); 
} 

public CustomEditField(long style) { 
    this(new XYEdges(20, 10, 20, 10), Field.FIELD_HCENTER 
      | Field.USE_ALL_WIDTH | Field.NON_SPELLCHECKABLE 
      | TextField.NO_NEWLINE | CONSUME_INPUT | style); 
} 

public CustomEditField(String label, String initialValue) { 
    this(0); 
    setLabel(label); 
    setText(initialValue); 
} 

public CustomEditField(XYEdges points, long style) { 
    super(style); 
    setPadding(points); 
} 

/** 
* Paints EditField Background with specified Format values 
*/ 
protected void paintBackground(Graphics graphics) { 
    graphics.setColor(Color.WHITE); 
    graphics.fillRoundRect(10, getPaddingTop(), getWidth() - 10, 
      getHeight() - getPaddingBottom(), 20, 20); 
    graphics.setColor(0x686868); 
    graphics.drawRoundRect(10, getPaddingTop(), getWidth() - 10, 
      getHeight() - getPaddingBottom(), 20, 20); 
    graphics.setColor(Color.BLACK); 
} 
+1

Скриншот очень поможет. – mrvincenzo

ответ

1

Во-первых, есть несколько концепций, чтобы убедиться, что вы поняли. Для Field существует margin, padding, a border. Here is a good description of what they represent ... связанный вопрос касался Android, но, насколько я знаю, Android и BlackBerry используют эти понятия так же.

Если вы хотите, чтобы ваш прямоугольник с закругленными углами, чтобы быть вашим граница, а затем, когда вы рисуете, вы не запускайте его, приходя в на сумму заполнения. Прокладка является то, что идет внутри границы. Итак, вы должны просто нарисовать ваши прямоугольники в (x, y) == (0,0). Если вы хотите предоставить некоторое пространство за пределами границы, чтобы быть буфером между другими полями, используйте для этого margin. Field объекты имеют вызов setMargin(), который выглядит так же, как setPadding().

Во-вторых, метод setCursorPosition() не предназначен для центрирования макета курсора в пространстве. It's for setting which character in the EditField the cursor should be next to. Не то, что вы хотите для этой проблемы.

Кроме того, ваш вышеприведенный код не строит прямоугольники симметрично. Помните, что когда у вас есть набивка с обеих сторон, вам нужно будет вычесть верхнюю нижнюю панель и, чтобы получить оставшуюся высоту, или вычесть левые и, чтобы получить оставшуюся ширину.

В любом случае, в зависимости от того, как вы на самом деле хотите, чтобы ваш CustomEditField был дополнен, вам может потребоваться немного изменить это. Но следующее, по крайней мере, даст вам поле редактирования, в котором курсор вертикально центрирован.

public class CustomEditField extends BasicEditField { 
    public CustomEditField() { 
     this(0); 
     setMaxSize(15); 
     //setCursorPosition(AXIS_VERTICAL); 
    } 

    public CustomEditField (long style) { 
     this(new XYEdges(20, 10, 20, 10), Field.FIELD_HCENTER | Field.USE_ALL_WIDTH | Field.NON_SPELLCHECKABLE 
      | TextField.NO_NEWLINE | CONSUME_INPUT | style); 
    } 

    public CustomEditField (String label, String initialValue) { 
     this(0); 
     setLabel(label); 
     setText(initialValue); 
    } 

    public CustomEditField (XYEdges points, long style) { 
     super(style); 
     setPadding(points); 
    } 

    /** 
    * Paints EditField Background with specified Format values 
    */ 
    protected void paintBackground(Graphics graphics) { 
     graphics.setColor(Color.WHITE); 
     graphics.fillRoundRect(0, 0, getWidth(), getHeight(), 20, 20); 
     graphics.setColor(0x686868); 
     graphics.drawRoundRect(0, 0, getWidth(), getHeight(), 20, 20); 
     graphics.setColor(Color.BLACK); 
    } 
} 

Обратите внимание, что это даст 20 пикселей пространства над текстом, прежде чем ваш прямоугольник с закругленными углами (если вы используете конструктор по умолчанию). Это похоже на многое. Возможно, это не то, что вы хотите. Вы можете принять прописку на всех четырех сторонах до 10 пикселей, а затем использовать поле setMargin() на поле, чтобы обеспечить некоторое пространство за пределами границы. Вам придется поиграть с ним.

Кстати, другой способ атаковать эту проблему, которую я использую много, - это обернуть свой EditField внутри Manager, как VerticalFieldManager. Если вы это сделаете и add() EditField для VerticalFieldManager, с флажками стиля = Field.FIELD_VCENTER, которые также должны выполнить вашу цель. Но в этом случае я не думаю, что это необходимо.

Смежные вопросы