Blackberry中的Custom LabelField无法正确显示文本

时间:2012-04-12 14:23:45

标签: blackberry custom-fields labelfield

我正在我的应用中实现Custom LabelField。它使用小字体工作正常,当我增加字体大小时,它将无法正常显示。在这里你可以看到这张图片。

enter image description here

您可以在图片中看到它只显示文本的一半。我怎么能克服这个。

这里我给出了自定义LabelField的代码。请告诉我我做错了什么。

public class CustomLabelField extends Field  
{  
    private String label;  
    private int fontSize;
    private int foregroundColor;  
    private int backgroundColor;  
    public CustomLabelField(String label, int fontSize, int foregroundColor,  
                     int backgroundColor,long style)  
    {  
        super(style);  
        this.label = label;  
        this.foregroundColor = foregroundColor;  
        this.backgroundColor = backgroundColor;  
        this.fontSize = fontSize;
    }  

   protected void layout(int width, int height) {  

       setExtent(width, getFont().getHeight());  


   }  

    protected void paint(Graphics graphics) {  

       graphics.setBackgroundColor(backgroundColor);  
       graphics.clear();  
       graphics.setFont(setMyFont());  
       graphics.setColor(foregroundColor);  
       graphics.drawText(label, 0, 0, (int)(getStyle()& DrawStyle.ELLIPSIS | DrawStyle.HALIGN_MASK),getWidth() - 6);  
   }  

   // Get font for the label field  
   public Font setMyFont()  
   {  
     try {  
         FontFamily alphaSansFamily = FontFamily.forName("BBAlpha Serif");  
         Font appFont = alphaSansFamily.getFont(Font.PLAIN, fontSize, Ui.UNITS_pt);  
         return appFont;  

    } catch (ClassNotFoundException e) {  
        // TODO Auto-generated catch block  
        e.printStackTrace();  
    }  
    return null;  
  }  

}

2 个答案:

答案 0 :(得分:3)

layout方法中,您将字段的高度设置为当前的默认字体高度。这意味着当您使用较大的字体绘制时,文本会被裁剪。要解决此问题,请将布局方法更改为:

protected void layout(int width, int height) {  

    int fieldHeight = Ui.convertSize(fontSize, Ui.UNITS_pt, Ui.UNITS_px);
    setExtent(width, fieldHeight);  
}  

这会将您想要的字体大小转换为像素,并使用它来设置字段高度。

答案 1 :(得分:3)

仅通过延长CustomLabelField来创建LabelField怎么样?然后,如果在构造函数中设置适当的样式位,则LabelField本身将完成布局,绘制文本的复杂性(对齐,换行,样式考虑等)和其他任务。

只需调用Field即可在setFont(Font)上应用任何字体。该字段本身将调整其大小和绘图。请查看以下摘录。

<小时/> CustomLabelField实现:

class CustomLabelField extends LabelField {
    private int foregroundColor;
    private int backgroundColor;

    public CustomLabelField(String label, int foregroundColor,
            int backgroundColor, long style) {
        super(label, style);
        this.foregroundColor = foregroundColor;
        this.backgroundColor = backgroundColor;
    }

    protected void paint(Graphics graphics) {
        graphics.setBackgroundColor(backgroundColor);
        graphics.clear();
        graphics.setColor(foregroundColor);
        super.paint(graphics);
    }
}

<小时/> 例如:

class MyScreen extends MainScreen {

    public Font getMyFont(int fontSize) {
        try {
            FontFamily alphaSansFamily = FontFamily.forName("BBAlpha Serif");
            return alphaSansFamily.getFont(Font.PLAIN, fontSize, Ui.UNITS_pt);
        } catch (Exception e) {
        }
        return null;
    }

    public MyScreen() {
        CustomLabelField clf = new CustomLabelField(
                    "Main",
                    Color.WHITE,
                    Color.BLACK,
                    LabelField.ELLIPSIS);

        // Font setup
        clf.setFont(getMyFont(20));

        add(clf);
    }
}