0

我想减少我的自动完成字段的高度。如何去做

这是我的代码

HorizontalFieldManager hfm = new HorizontalFieldManager();
LabelField lbl = new LabelField(" Name:                 ");

final AutoCompleteField TextField1 = new AutoCompleteField(filterLst)
{
    public int getPreferredWidth() 
    {
        return Display.getWidth()/2;
    }

    public void sublayout(int maxWidth, int maxheight)
    {
        super.sublayout(getPreferredWidth(), getPreferredHeight());
        setExtent(getPreferredWidth(), getPreferredHeight());
    }
};
hfm.add(lbl);
hfm.add(TextField1);
add(hfm); 

下图是它的外观。我希望它看起来与我用于其他标签的编辑字段大小相同。

这是我的编辑字段代码

   //Add box next to field for containing input 
   HorizontalFieldManager hfm1 = new HorizontalFieldManager();
   LabelField lbl1 = new LabelField(" Amount:              ");

   final EditField TextField2 = new EditField()
   {
      boolean _drawFocus = false;
      protected void layout(int maxWidth, int maxHeight) 
      {
         super.layout(Math.min(maxWidth, 300), Math.min(maxHeight, 30));
      }
      protected boolean keyChar(char ch, int status, int time) 
      {
         if (CharacterUtilities.isDigit(ch) || (ch == Characters.BACKSPACE)) 
         {
            return super.keyChar(ch, status, time);
         }
         return true;
      }
      protected void drawFocus(Graphics graphics,boolean on) 
      {
         _drawFocus = on;
         super.drawFocus(graphics, on);
         _drawFocus = false;
      }    
      protected void paint(Graphics g)
      {       
         if ( _drawFocus ) 
         {
            super.paint(g);
            return;
         } 
         g.clear();
         g.drawRect(0,0, 50, 50);
         int oldColor = g.getColor();
         g.setColor(Color.WHITE);
         g.fillRect(0, 0, this.getPreferredWidth(), this.getPreferredHeight());
         g.setColor(oldColor);
         g.drawRect(100, 100, 50, 50);
         super.paint(g);
      }
   };
   TextField2.setBorder(BorderFactory.createRoundedBorder(new XYEdges(6,6,6,6)));
   hfm1.add(lbl1);
   hfm1.add(TextField2);
   add(hfm1);

在此处输入图像描述

我希望用于名称的自动完成字段的大小与其他字段相同。请帮助。

谢谢

4

1 回答 1

1

可能给您带来麻烦的一件事EditField是人们通常认为的Field. AutoCompleteField但是,处理起来更像是Manager. 当然,它想成为 a Manager,因为它(可能)包含 a EditField,但随后还将包含另一个Field动态显示自动完成选项的子项。

(非管理器)FieldManager子类处理布局略有不同,所以我发现尝试用正常的方法解决这个问题,getPreferredHeight()并且对我来说效果不佳。layout()sublayout()

所以,我做的是双重的:

  1. AutoCompleteField首先,我试图用你的子类来模仿默认的装饰EditField。这并不完美。如果您希望它们看起来完全一样,您可能需要paint()为两者编写自定义方法。你说这个问题只是想调整字段的大小,所以我认为这已经足够好了。
  2. 其次,由于AutoCompleteField似乎包含一个子 EditField(至少在逻辑上......我不确定它是否以这种方式实现),我决定尝试让 EditField 以与正常匹配的方式选择自己的大小编辑字段。为此,我通过简单地设置Font每个字段的高度来控制所有字段的高度。

我对您的代码的更改:

  final int fontSize = 24;   // pick whatever you like here
  final int pad = 2;
  final int margin = 2;

我删除了layout()试图控制高度的编辑字段方法中的代码,因为......正如我所说,我没有成功以类似的方式设置自动完成字段的高度。我刚刚将您的编辑字段更改layout()为非常标准的实现:

  final EditField TextField2 = new EditField()
  {
     boolean _drawFocus = false;
     protected void layout(int maxWidth, int maxHeight) 
     {
        super.layout(getPreferredWidth(), getPreferredHeight());
     }

然后,我在您的编辑字段上设置了填充,因为在我看来它AutoCompleteField使用了 2 个像素的填充(在 5.0 Storm2 上)。您可能不关心这个 UI,但它似乎也有 2 个像素的边距。

  TextField2.setPadding(pad, pad, pad, pad);
  TextField2.setMargin(margin, margin, margin, margin);

然后,我为您的所有字段设置相同的字体。它不必是默认字体。只是让它们都一样。这一步似乎决定了由AutoCompleteField...设置字体绘制的圆角矩形字段的可见大小。

  Font font = Font.getDefault().derive(Font.PLAIN, fontSize);
  TextField1.setFont(font);
  TextField2.setFont(font);

之后,编辑字段和自动完成字段的高度应该一致。我在 5.0 9550 上对此进行了测试。由于 pad 和 margin 值是通过实验确定的,我完全可以相信这些值(例如 2 个像素)可能会在不同的设备上发生变化。您可能需要进行一些实验。

于 2012-05-30T07:49:45.113 回答