gpt4 book ai didi

java - Blackberry ListField 文本换行 - 仅两行

转载 作者:行者123 更新时间:2023-11-30 05:14:21 25 4
gpt4 key购买 nike

在我的 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 值已正确偏移,并​​且仅在字符串宽度超过屏幕宽度后绘制文本,以及之后的剩余字符串),但是,每个当我尝试获取前两行时,如果字符串超出两行,它总是会返回字符串的最后两行。由于我还没有什么想法,有没有更好的方法来做这种事情?

最佳答案

我不完全确定我理解你的问题,但在我看来,你需要一个在两行后放弃的自动换行算法。如果是这种情况,那么这应该有望为您指明正确的方向。

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;
}

关于java - Blackberry ListField 文本换行 - 仅两行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2187245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com