如何在CustomEditField中间设置光标位置?

时间:2012-06-08 13:47:51

标签: user-interface blackberry blackberry-jde

我创建了一个带有圆角边框的自定义编辑字段。但光标显示在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 个答案:

答案 0 :(得分:1)

首先,有一些概念可以确保你清楚。对于Field,有边距填充边框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个像素的空间。这看起来很多。也许这不是你想要的。您可能决定将所有4个边上的填充减少到10个像素,然后在字段上使用setMargin()以在边框外提供一些空间。你必须要玩它。

顺便说一下,另一种解决这个问题的方法,就是我使用了很多,就是将你的EditField包装在Manager内,就像VerticalFieldManager一样。如果你这样做,并且add() EditField到VerticalFieldManager,样式标志= Field.FIELD_VCENTER,那么这也应该达到你的目标。但在这种情况下,我认为这不是必要的。