2010-02-02 63 views
1

在我的ListField中,我希望能夠接受任何給定的長字符串,並且能夠在屏幕寬度範圍內打包第一行,然後只留下剩餘的字符串和將其顯示在下面並省略其餘部分。現在,這是我用我的畫漆調用內檢測包裝內容:黑莓ListField文本包裝 - 只有兩行

int totalWidth = 0; 
int charWidth = 0; 
int lastIndex = 0; 
int spaceIndex = 0; 
int lineIndex = 0; 
String firstLine = ""; 
String secondLine = ""; 
boolean isSecondLine = false; 

for (int i = 0; i < longString.length(); i++){ 
    charWidth = Font.getDefault().getAdvance(String.valueOf(longString.charAt(i))); 
    //System.out.println("char width: " + charWidth); 
    if(longString.charAt(i) == ' ') 
    spaceIndex = i; 
    if((charWidth + totalWidth) > (this.getWidth()-32)){ 
      //g.drawText(longString.substring(lastIndex, spaceIndex), xpos, y +_padding, DrawStyle.LEFT, w - xpos); 
      lineIndex++; 
    System.out.println("current lines to draw: " + lineIndex); 
    /*if (lineIndex = 2){ 
    int idx = i; 
    System.out.println("first line " + longString.substring(lastIndex, spaceIndex)); 
    System.out.println("second line " + longString.substring(spaceIndex+1, longString.length())); 
    }*/ 
    //firstLine = longString.substring(lastIndex, spaceIndex); 
    firstLine = longString.substring(0, spaceIndex); 
    //System.out.println("first new line: " +firstLine); 
    //isSecondLine=true; 
    //xpos = 0; 
    //y += Font.getDefault().getHeight(); 
    i = spaceIndex + 1; 
    lastIndex = i; 
    System.out.println("Rest of string: " + longString.substring(lastIndex, longString.length())); 

    charWidth = 0; 
    totalWidth = 0; 
    } 
    totalWidth += charWidth; 
    System.out.println("total width: " + totalWidth); 
    //g.drawText(longString.substring(lastIndex, i+1), xpos, y + (_padding*3)+4, DrawStyle.ELLIPSIS, w - xpos); 

    //secondLine = longString.substring(lastIndex, i+1); 
    secondLine = longString.substring(lastIndex, longString.length()); 
    //isSecondLine = true; 
} 

現在這樣做的實際包裝任何給定的字符串(假設y值了偉大的工作得到適當的抵消,而且只畫在字符串寬度之後的文本超出了屏幕寬度,以及之後的剩餘字符串),但是,每當我嘗試獲取前兩行時,如果超過兩個字符串,它總是返回字符串的最後兩行線。有沒有更好的方法來做這種事情,因爲我剛剛從創意中脫穎而出?

回答

2

我不完全確定我明白你的問題,但它聽起來像你需要一個字的包裝算法,放棄兩行後。如果是這樣的話,這應該有希望讓你指出正確的方向。

void wrapString(String inputString, int width, Font font){ 
    String line1; 
    String line2; 

    if (font.getAdvance(inputString) <= width){ 
     line1 = inputString; 
     line2 = ""; 
    } 
    else{ 
     int charsInLine1 = countCharsInLine(inputString, 0, inputString.length()-1, width, font); 
     int lineBreak = inputString.lastIndexOf(' ', charsInLine1); 
     if (lineBreak == -1) 
      lineBreak = charsInLine1; 
     line1 = inputString.substring(0, lineBreak); 

     line2 = inputString.substring(lineBreak+1, inputString.length()); 
     if (font.getAdvance(line2) > width){ 
      int charsInLine2 = countCharsInLine(line2, 0, inputString.length()-1, width - font.getAdvance("..."), font); 
      line2 = line2.substring(0, charsInLine2) + "..."; 
     } 
    } 

    System.out.println("line1: " + line1); 
    System.out.println("line2: " + line2); 
} 

int countCharsInLine(String str, int min, int max, int width, Font font) { 

    if (min >= max) 
     return max; 

    int guess = min + (max - min)/2; 
    int advance = font.getAdvance(str, 0, guess); 

    if (advance < width) 
     return countCharsInLine(str, guess+1, max, width, font); 
    else if (advance > width) 
     return countCharsInLine(str, min, guess-1, width, font); 
    else 
     return guess; 
} 
+0

感謝您的幫助,到目前爲止,它不需要進行第二行字體預先檢查,因爲在嘗試補償省略號寬度之後,它在嘗試猜測字符長度時中斷。但是,我能夠在單獨的函數中使用與drawText調用相同的算法,並讓第二行省略號以進行調用。到目前爲止,感謝您的幫助,儘管我想知道您是否可以重新評估僅用於踢球的猜測計算。 – 2010-02-17 17:00:52

0

我做了類似的事情,但它會返回所有變形的線。然後,您可以使用返回矢量的第一個元素,並結合其餘元素得到你想要的兩條線:

private Vector wrap (String text, int width) 
{ 
    Vector result = new Vector(); 

    String remaining = text; 


    while (remaining.length()>=0) 
    { 
     int index = getSplitIndex(remaining, width); 

     if (index == -1) 
      break; 

     result.addElement(remaining.substring(0,index)); 

     remaining = remaining.substring(index); 

     if (index == 0) 
      break; 
    } 

    return result; 
} 


private int getSplitIndex(String bigString, int width) 
{ 
    int index = -1; 
    int lastSpace = -1; 
    String smallString=""; 
    boolean spaceEncountered = false; 
    boolean maxWidthFound = false; 

    for (int i=0; i<bigString.length(); i++) 
    { 
     char current = bigString.charAt(i); 
     smallString += current; 


     if (current == ' ') 
     { 
      lastSpace = i; 
      spaceEncountered = true; 
     } 

     int linewidth = this.getFont().getAdvance(smallString,0, smallString.length()); 

     if(linewidth>width) 
     { 
      if (spaceEncountered) 
       index = lastSpace+1; 
      else 
       index = i; 

      maxWidthFound = true; 

      break; 


     } 


    } 

    if (!maxWidthFound) 
     index = bigString.length(); 


    return index; 
} 

我仍然在測試和工作正常,直到如今。