0

我创建了一个带有圆形边框的自定义编辑字段。但是光标显示在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);
}
4

1 回答 1

1

首先,有一些概念可以确保你清楚。对于 a Field,有边距、内边距边框这是对它们所代表的内容的一个很好的描述……链接的问题是关于 Android 的,但据我所知,Android 和黑莓以相同的方式使用这些概念。

如果您希望圆角矩形成为您的边框,那么当您绘制它时,您不会通过填充量来开始它。填充是边界内的内容。因此,您应该在 (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 包装在 aManager中,比如 a VerticalFieldManager。如果您这样做,并将add()EditField 与 VerticalFieldManager 一起使用样式标志 = Field.FIELD_VCENTER,那也应该实现您的目标。但在这种情况下,我认为没有必要。

于 2012-06-10T05:41:11.177 回答