2009-10-23 4 views
0

J'ai créé mon propre customlabelfield, en utilisant ce customlabelfield je peux capable de modifier la couleur de fond, la couleur, la largeur et la taille de police ... Quand j'utilise ce champ label dans la version 4.6 je peux obtenir la sortie attendue le texte n'est pas une suite en ligne simple, alors il arrive automatiquement en deuxième ligne, mais si j'utilise la même chose en version 4.5, le texte ne vient pas à la ligne suivante et parfois il montre la moitié du texte. avoir une idée pour résoudre ce problème pls partager avec moi.Comment créer CustomLabelField quelles suites pour toutes les versions blackberry?

Répondre

2

Ma mise en œuvre du contrôle de bouton:

  • ont une taille fixe, la police et le texte décalé
  • si l'étiquette ne peut pas adapter à une seule ligne, montrer l'étiquette dans plusieurs lignes de largeur maximale
  • il n'y a plus de lignes peut s'adapter, montrer des points de suspension à la fin de la ligne

alt text http://img297.imageshack.us/img297/8360/multilinebuttons.jpg
Un code de bouton personnalisé:

class CustomButton extends ButtonField { 
int mHeight; 
int mWidth; 
int LEFT_OFFSET = 2; 
int TOP_OFFSET = 2; 

public CustomButton(int height, int width, String label) { 
    super(label, CONSUME_CLICK); 
    mHeight = height; 
    mWidth = width; 
    setFont(getFont().derive(Font.PLAIN, 16)); 
} 

public int getPreferredHeight() { 
    return mHeight; 
} 

public int getPreferredWidth() { 
    return mWidth; 
} 

protected void layout(int width, int height) { 
    super.layout(mWidth, mHeight); 
    setExtent(mWidth, mHeight); 
} 

protected void paint(Graphics graphics) { 
    int textHeight = getFont().getHeight(); 
    int twoLinesHeight = 2 * textHeight + TOP_OFFSET; 
    // check if first line fit in button height 
    int fitHeight = mHeight - 2 * TOP_OFFSET; 
    if (textHeight <= fitHeight) { 
    graphics.setColor(Color.WHITE); 
    String label = getLabel(); 
    int textLenght = getFont().getAdvance(label); 
    // check if whole label fit in button width 
    int fitWidth = mWidth - 2 * LEFT_OFFSET; 
    if (textLenght <= fitWidth) { 
    graphics.drawText(label, LEFT_OFFSET, TOP_OFFSET); 
    } else { 
    Vector lines = splitLabelToLines(); 
    int lineTopOffset = TOP_OFFSET; 
    int linesCount = lines.size(); 
    for (int i = 0; i < linesCount; i++) { 
    String line = (String) lines.elementAt(i); 

    // if lines will not fit in button height, draw ellipsis 
    int moreLinesHeight = lineTopOffset + twoLinesHeight; 
    boolean moreLinesFit = moreLinesHeight <= fitHeight; 
    boolean lastLine = (i == linesCount - 1); 
    if (moreLinesFit || lastLine) { 
     graphics.drawText(line, LEFT_OFFSET, lineTopOffset); 
     lineTopOffset += TOP_OFFSET + textHeight; 
    } else { 
     line += "..."; 
     int lineLenght = getFont().getAdvance(line); 
     if (lineLenght > fitWidth) { 
     int len = Math.max(0, line.length() - 6); 
     line = line.substring(0, len) + "..."; 
     } 
     graphics.drawText(line, LEFT_OFFSET, lineTopOffset); 
     break; 
    } 
    } 
    } 
    } 
} 

private Vector splitLabelToLines() { 
    int fitWidth = mWidth - 2 * LEFT_OFFSET; 
    String label = getLabel(); 
    int lbLen = label.length(); 
    Vector lines = new Vector(); 
    int begin = 0; 
    // while there are more chars in label 
    while (begin < lbLen - 1) { 
    // new line 
    String lnText = ""; 
    // line width in pixels 
    int lnWidth = 0; 
    // line width in chars 
    int lnLen = 0; 
    // while line fit button width or label chars ends 
    while ((lnWidth < fitWidth) && (begin + lnLen < lbLen)) { 
    lnLen++; 
    lnText = label.substring(begin, begin + lnLen); 
    lnWidth = getFont().getAdvance(lnText); 
    } 
    if (begin + lnLen < lbLen) 
    lnLen--; 
    begin += lnLen; 
    lnText = lnText.substring(0, lnLen); 
    lines.addElement(lnText); 
    } 
    return lines; 
} 
} 

Exemple d'utilisation:

class Scr extends MainScreen { 
CustomButton button1; 
CustomButton button2; 
CustomButton button3; 

public Scr() { 
    add(button1 = new CustomButton(20, 60, 
    "first buttton it's with a large text")); 
    add(button2 = new CustomButton(40, 120, 
    "second buttton it's with a large text")); 
    add(button3 = new CustomButton(60, 200, 
    "third buttton it's with a large text")); 
} 
} 
Questions connexes