Как установить позицию курсора в середине 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);
}

person user1427659    schedule 08.06.2012    source источник
comment
Скриншот будет очень полезным.   -  person tonymontana    schedule 09.06.2012


Ответы (1)


Во-первых, есть несколько концепций, которые вам нужно понять. Для Field есть поля, отступ и граница. Вот хорошее описание того, что они представляют ... связанный вопрос касался Android, но, насколько мне известно, Android и BlackBerry используют эти концепции одинаково.

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

Во-вторых, метод setCursorPosition() на самом деле не предназначен для центрирования расположения курсора в пространстве. Это для установки символа в EditField, рядом с которым должен быть курсор. Не то, что вам нужно для этой проблемы.

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

В любом случае, в зависимости от того, как вы действительно хотите, чтобы ваш 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 пикселей пространства над текстом перед закругленным прямоугольником (если вы используете конструктор по умолчанию). Похоже, много. Может быть, это не совсем то, что вам нужно. Вы можете решить уменьшить отступ со всех 4 сторон до 10 пикселей, а затем использовать setMargin() в поле, чтобы оставить пространство за пределами границы. Вам придется поиграть с этим.

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

person Nate    schedule 10.06.2012