在LineBreakMeasurer中处理\ n

时间:2009-07-13 15:27:47

标签: java text drawing awt

有一千篇文章如何使用LineBreakMeasurer绘制多行文本,但是没有关于绘制多行文本也没有考虑到\ n(当你想在文本中的特定位置强制换行而不是只有当右边或左边的边距结束时。

秘密似乎在于BreakIterator,但我找不到处理\ n的实现。

4 个答案:

答案 0 :(得分:3)

使用重载的LineBreakMeasurer方法,而不是LBM的{​​{1}}')nextLayout(float)方法。这允许您限制LBM.nextLayout(float, int, boolean)将包含在返回的LBM中的文本。在您的情况下,您将指示它不要超越下一个换行符。

此代码段应该为您提供这个想法。首先使用TextLayout来“窥视”哪个字符索引将成为下一个布局的结尾。然后迭代您的字符串内容直到该偏移量,看看是否找到任何换行符。如果你这样做,那么使用找到的限制作为LBM.nextOffset的第二个参数,它将告诉nextLayout(float, int, boolean)不要超过换行符:

LBM

参考

http://java.sun.com/developer/onlineTraining/Media/2DText/style.html#layout http://java.sun.com/developer/onlineTraining/Media/2DText/Code/LineBreakSample.java

答案 1 :(得分:2)

首先对文本进行标记,然后将LineBreakMeasureCode应用于每个标记。

答案 2 :(得分:1)

我发现此代码适用于换行问题。我使用atdixon作为模板来获得这个。

while (measurer.getPosition() < paragraph.getEndIndex()) {
   next = measurer.nextOffset(wrappingWidth);
   limit = next;
   charat = tested.indexOf('\n',measurer.getPosition()+1);
   if(next > (charat - measurer.getPosition()) && charat != -1){
      limit = charat - measurer.getPosition();
   }
   layout = measurer.nextLayout(wrappingWidth, measurer.getPosition()+limit, false);
   // Do the rest of your layout and pen work.
}

答案 3 :(得分:1)

Aaron的代码并不总是正常工作,所以这里有一些适合我的调整代码:

int next = measurer.nextOffset(width);
int limit = next;
if (limit <= text.length()) {
  for (int i = measurer.getPosition(); i < next; ++i) {
    char c = text.charAt(i);
    if (c == '\n') {
      limit = i + 1;
      break;
    }
  }
}
TextLayout textLayout = measurer.nextLayout(width, limit, false);

如果您需要来自AttributedString的文本,您可以事先执行此操作

AttributedCharacterIterator iterator = attributedString.getIterator();
StringBuilder stringBuilder = new StringBuilder(iterator.getEndIndex());
while (iterator.getIndex() < iterator.getEndIndex()) {
  stringBuilder.append(iterator.current());
  iterator.next();
}
String text = stringBuilder.toString();