JavaTM 2 Platform
Standard Ed. 5.0

java.awt.font
类 TextLayout

java.lang.Object
  继承者 java.awt.font.TextLayout
所有已实现的接口:
Cloneable

public final class TextLayout
extends Object
implements Cloneable

TextLayout 是样式字符数据的不可变图形表示形式。

它提供以下功能:

TextLayout 对象可以使用其 draw 方法呈现。

可以直接构造 TextLayout 或通过使用 LineBreakMeasurer 构造它。直接进行构造时,源文本表示一个段落。LineBreakMeasurer 允许带样式的文本断行,以适应特定的宽度。有关的更多信息,请参阅 LineBreakMeasurer 文档。

TextLayout 的逻辑构造过程如下:

TextLayout 对象的方法返回的所有图形信息都相对于 TextLayout 的原点,它是 TextLayout 对象的基线与其左边缘的交叉点。而且,还假定传递到 TextLayout 对象的方法的坐标也相对于 TextLayout 对象的原点。客户端通常需要在 TextLayout 对象的坐标系统和另一对象(如 Graphics 对象)中的坐标系统之间进行转换。

根据样式文本创建 TextLayout 对象,但它们不保留对其源文本的引用。因此,对先前用来生成 TextLayout 的文本的改动不会影响 TextLayout

TextLayout 对象的三个方法(getNextRightHitgetNextLeftHithitTestChar)都返回 TextHitInfo 实例。这些 TextHitInfo 对象中的偏移量相对于 TextLayout 的起始处,而不是相对于用于创建 TextLayout 的文本。同样,接受 TextHitInfo 实例作为参数的 TextLayout 方法将 TextHitInfo 对象的偏移量看做相对于 TextLayout,而不是相对于其他任何基础文本存储模型。

示例

构造并绘制 TextLayout 及其边界矩形:

   Graphics2D g = ...;
   Point2D loc = ...;
   Font font = Font.getFont("Helvetica-bold-italic");
   FontRenderContext frc = g.getFontRenderContext();
   TextLayout layout = new TextLayout("This is a string", font, frc);
   layout.draw(g, (float)loc.getX(), (float)loc.getY());

   Rectangle2D bounds = layout.getBounds();
   bounds.setRect(bounds.getX()+loc.getX(),
                  bounds.getY()+loc.getY(),
                  bounds.getWidth(),
                  bounds.getHeight());
   g.draw(bounds);
 

TextLayout 进行命中测试(确定哪个字符位于特定图形位置上):

   Point2D click = ...;
   TextHitInfo hit = layout.hitTestChar(
                         (float) (click.getX() - loc.getX()),
                         (float) (click.getY() - loc.getY()));
 

对按下向右方向键进行响应:

   int insertionIndex = ...;
   TextHitInfo next = layout.getNextRightHit(insertionIndex);
   if (next != null) {
       // translate graphics to origin of layout on screen
       g.translate(loc.getX(), loc.getY());
       Shape[] carets = layout.getCaretShapes(next.getInsertionIndex());
       g.draw(carets[0]);
       if (carets[1] != null) {
           g.draw(carets[1]);
       }
   }
 

绘制一个对应于源文本中的子字符串的选择范围。选择的区域在视觉上可能是不连续的:

   // selStart, selLimit should be relative to the layout,
   // not to the source text

   int selStart = ..., selLimit = ...;
   Color selectionColor = ...;
   Shape selection = layout.getLogicalHighlightShape(selStart, selLimit);
   // selection may consist of disjoint areas
   // graphics is assumed to be tranlated to origin of layout
   g.setColor(selectionColor);
   g.fill(selection);
 

绘制一个视觉上连续的选择范围。选择范围可能对应源文本中的多个子字符串。通过 getLogicalRangesForVisualSelection() 可以获得相应源文本的子字符串范围:

   TextHitInfo selStart = ..., selLimit = ...;
   Shape selection = layout.getVisualHighlightShape(selStart, selLimit);
   g.setColor(selectionColor);
   g.fill(selection);
   int[] ranges = getLogicalRangesForVisualSelection(selStart, selLimit);
   // ranges[0], ranges[1] is the first selection range,
   // ranges[2], ranges[3] is the second selection range, etc.
 

另请参见:
LineBreakMeasurer, TextAttribute, TextHitInfo

嵌套类摘要
static class TextLayout.CaretPolicy
          定义确定强插入符位置的策略。
 
字段摘要
static TextLayout.CaretPolicy DEFAULT_CARET_POLICY
          客户端未指定策略时使用此 CaretPolicy
 
构造方法摘要
TextLayout(AttributedCharacterIterator text, FontRenderContext frc)
          根据样式文本上的迭代器构造一个 TextLayout
TextLayout(String string, Font font, FontRenderContext frc)
          根据 StringFont 构造一个 TextLayout
TextLayout(String string, Map<? extends AttributedCharacterIterator.Attribute,?> attributes, FontRenderContext frc)
          根据 String 和属性集构造一个 TextLayout
 
方法摘要
protected  Object clone()
          创建此 TextLayout 的副本。
 void draw(Graphics2D g2, float x, float y)
          在指定的 Graphics2D 上下文中的指定位置上呈现此 TextLayout
 boolean equals(Object obj)
          如果指定 Object 是一个 TextLayout 对象,且指定的 Object 等于此 TextLayout,则返回 true
 boolean equals(TextLayout rhs)
          如果两个布局相等,则返回 true
 float getAdvance()
          返回此 TextLayout 的 advance。
 float getAscent()
          返回此 TextLayout 的 ascent。
 byte getBaseline()
          返回此 TextLayout 的基线。
 float[] getBaselineOffsets()
          返回用于此 TextLayout 的基线的偏移量数组。
 Shape getBlackBoxBounds(int firstEndpoint, int secondEndpoint)
          返回指定范围中字符的黑框边界。
 Rectangle2D getBounds()
          返回此 TextLayout 的边界。
 float[] getCaretInfo(TextHitInfo hit)
          返回与对应于 hit 的插入符有关的信息。
 float[] getCaretInfo(TextHitInfo hit, Rectangle2D bounds)
          返回与对应于 hit 的插入符有关的信息。
 Shape getCaretShape(TextHitInfo hit)
          返回表示此 TextLayout 的自然边界中指定目标字符处的插入符的 Shape
 Shape getCaretShape(TextHitInfo hit, Rectangle2D bounds)
          返回表示指定边界内指定目标字符处的插入符的 Shape
 Shape[] getCaretShapes(int offset)
          返回对应于强插入符和弱插入符的两条路径。
 Shape[] getCaretShapes(int offset, Rectangle2D bounds)
          返回对应于强插入符和弱插入符的两条路径。
 Shape[] getCaretShapes(int offset, Rectangle2D bounds, TextLayout.CaretPolicy policy)
          返回对应于强插入符和弱插入符的两条路径。
 int getCharacterCount()
          返回由此 TextLayout 表示的字符数。
 byte getCharacterLevel(int index)
          返回 index 处字符的级别。
 float getDescent()
          返回此 TextLayout 的 descent。
 TextLayout getJustifiedLayout(float justificationWidth)
          创建调整到指定宽度的此 TextLayout 的一个副本。
 float getLeading()
          返回 TextLayout 的行距。
 Shape getLogicalHighlightShape(int firstEndpoint, int secondEndpoint)
          返回封闭指定范围中逻辑选择范围的 Shape,它扩展到了此 TextLayout 的自然边界。
 Shape getLogicalHighlightShape(int firstEndpoint, int secondEndpoint, Rectangle2D bounds)
          返回封闭指定范围中扩展到指定 bounds 的逻辑选择范围的 Shape
 int[] getLogicalRangesForVisualSelection(TextHitInfo firstEndpoint, TextHitInfo secondEndpoint)
          返回对应于可视选择范围的逻辑文本范围。
 TextHitInfo getNextLeftHit(int offset)
          返回下一个插入符左侧(顶部)的目标字符;如果没有这种字符,则返回 null
 TextHitInfo getNextLeftHit(int offset, TextLayout.CaretPolicy policy)
          返回下一个插入符左侧(顶部)的目标字符;如果没有这种字符,则返回 null
 TextHitInfo getNextLeftHit(TextHitInfo hit)
          返回下一个插入符左侧(顶部)的目标字符;如果没有这种字符,则返回 null
 TextHitInfo getNextRightHit(int offset)
          返回下一个插入符右侧(底部)的目标字符;如果没有这种字符,则返回 null
 TextHitInfo getNextRightHit(int offset, TextLayout.CaretPolicy policy)
          返回下一个插入符右侧(底部)的目标字符;如果没有这种字符,则返回 null
 TextHitInfo getNextRightHit(TextHitInfo hit)
          返回下一个插入符右侧(底部)的目标字符;如果没有这种字符,则返回 null
 Shape getOutline(AffineTransform tx)
          返回表示此 TextLayout 的轮廓的 Shape
 float getVisibleAdvance()
          返回此 TextLayout 的 advance 与结尾空白的差。
 Shape getVisualHighlightShape(TextHitInfo firstEndpoint, TextHitInfo secondEndpoint)
          返回封闭指定范围中扩展到指定边界的可视选择范围的 Shape
 Shape getVisualHighlightShape(TextHitInfo firstEndpoint, TextHitInfo secondEndpoint, Rectangle2D bounds)
          返回封闭指定范围中扩展到 bounds 的可视选择范围的路径。
 TextHitInfo getVisualOtherHit(TextHitInfo hit)
          返回位于指定目标字符的插入符另一侧的目标字符。
protected  void handleJustify(float justificationWidth)
          调整此布局。
 int hashCode()
          返回此 TextLayout 的哈希码。
 TextHitInfo hitTestChar(float x, float y)
          返回对应于指定点的 TextHitInfo
 TextHitInfo hitTestChar(float x, float y, Rectangle2D bounds)
          返回对应于指定点的 TextHitInfo
 boolean isLeftToRight()
          如果此 TextLayout 的基本方向是从左到右,则返回 true;如果基本方向是从右到左,则返回 false
 boolean isVertical()
          如果此 TextLayout 是垂直的,则返回 true
 String toString()
          返回此 TextLayout 的调试信息。
 
从类 java.lang.Object 继承的方法
finalize, getClass, notify, notifyAll, wait, wait, wait
 

字段详细信息

DEFAULT_CARET_POLICY

public static final TextLayout.CaretPolicy DEFAULT_CARET_POLICY
客户端未指定策略时使用此 CaretPolicy。对于此策略,方向与行方向相同的字符的命中要强于对反方向字符的命中。如果字符的方向相同,则对字符开始边的命中要强于对字符结尾边的命中。

构造方法详细信息

TextLayout

public TextLayout(String string,
                  Font font,
                  FontRenderContext frc)
根据 StringFont 构造一个 TextLayout。使用指定的 Font 样式化所有文本。

String 必须指定单个文本段,因为双向算法需要整个段落。

参数:
string - 要显示的文本
font - 用于样式化文本的 Font
frc - 包含关于正确测量文本所需的图形设备的信息。根据设备分辨率和属性(如抗锯齿)的不同,文本测量可能稍有变化。此参数未指定 TextLayout 和用户空间之间的转换。

TextLayout

public TextLayout(String string,
                  Map<? extends AttributedCharacterIterator.Attribute,?> attributes,
                  FontRenderContext frc)
根据 String 和属性集构造一个 TextLayout

使用提供的属性样式化所有文本。

String 必须指定单个文本段,因为双向算法需要整个段落。

参数:
string - 要显示的文本
attributes - 用于样式化文本的属性
frc - 包含关于正确测量文本所需的图形设备的信息。根据设备分辨率和属性(如抗锯齿)的不同,文本测量可能稍有变化。此参数未指定 TextLayout 和用户空间之间的转换。

TextLayout

public TextLayout(AttributedCharacterIterator text,
                  FontRenderContext frc)
根据样式文本上的迭代器构造一个 TextLayout

该迭代器必须指定单个文本段,因为双向算法需要整个段落。

参数:
text - 要显示的样式文本
frc - 包含关于正确测量文本所需的图形设备的信息。根据设备分辨率和属性(如抗锯齿)的不同,文本测量可能稍有变化。此参数未指定 TextLayout 和用户空间之间的转换。
方法详细信息

clone

protected Object clone()
创建此 TextLayout 的副本。

覆盖:
Object 中的 clone
返回:
此实例的一个克隆。
另请参见:
Cloneable

getJustifiedLayout

public TextLayout getJustifiedLayout(float justificationWidth)
创建调整到指定宽度的此 TextLayout 的一个副本。

如果已调整了此 TextLayout,则抛出异常。如果此 TextLayout 对象的调整率为零,将返回与此 TextLayout 相同的 TextLayout

参数:
justificationWidth - 调整行时使用的宽度。要获得最佳结果,该宽度与行的当前 advance 不应有太大差别。
返回:
调整到指定宽度的 TextLayout
抛出:
Error - 如果已调整了此布局,则抛出 Error。

handleJustify

protected void handleJustify(float justificationWidth)
调整此布局。子类重写该方法来控制调整(如果存在子类,即...) 只在段落属性(来自源文本,可以是布局属性的默认值)指示一个非零调整率时才调整布局。将文本调整到指示的宽度。当前实现还调整标点和尾部空白,使其接近于调整宽度。调整布局之后将不会对其进行再调整。

某些代码依赖于布局的不可变性。因此子类不应直接调用该方法,而是应调用 getJustifiedLayout,getJustifiedLayout 将在此布局的副本上调用此方法,而保留原始布局。

参数:
justificationWidth - 调整行时使用的宽度。要获得最佳结果,该宽度与行的当前 advance 不应有太大差别。
另请参见:
getJustifiedLayout(float)

getBaseline

public byte getBaseline()
返回此 TextLayout 的基线。基线是 Font 中定义的一个值,它可以是 roman、centered 或 hanging。Ascent 和 descent 相对于此基线。baselineOffsets 也相对于此基线。

返回:
TextLayout 的基线。
另请参见:
getBaselineOffsets(), Font

getBaselineOffsets

public float[] getBaselineOffsets()
返回用于此 TextLayout 的基线的偏移量数组。

该数组用 Font 中定义的 roman、centered 或 hanging 值之一进行索引。这些值相对于此 TextLayout 对象的基线,所以 getBaselineOffsets[getBaseline()] == 0。将偏移量添加到 TextLayout 对象基线所在的位置处,以获取新基线的位置。

返回:
包含用于此 TextLayout 的基线的偏移量数组。
另请参见:
getBaseline(), Font

getAdvance

public float getAdvance()
返回此 TextLayout 的 advance。该 advance 是在行方向上测量的、从原点到最右端(底部)字符 advance 的距离。

返回:
TextLayout 的 advance。

getVisibleAdvance

public float getVisibleAdvance()
返回此 TextLayout 的 advance 与结尾空白的差。

返回:
TextLayout 的 advance 与结尾空白的差。
另请参见:
getAdvance()

getAscent

public float getAscent()
返回此 TextLayout 的 ascent。ascent 是从 TextLayout 的顶端(右端)到基线的距离。它始终为正数或零。ascent 足以容纳上标文本,它是每个字形的 ascent、offset 和 baseline 总和的最大值。

返回:
TextLayout 的 ascent。

getDescent

public float getDescent()
返回此 TextLayout 的 descent。descent 是从基线到 TextLayout 底部(左端)的距离。它始终为正数或零。descent 足以容纳下标文本,它是每个字形的 descent、偏移量和基线总和的最大值。

返回:
TextLayout 的 descent。

getLeading

public float getLeading()
返回 TextLayout 的行距。行距是建议的此 TextLayout 的行间距。

行距通过 TextLayout 中所有字形向量的 leading、descent 和 baseline 计算。算法大致如下:

 maxD = 0;
 maxDL = 0;
 for (GlyphVector g in all glyphvectors) {
    maxD = max(maxD, g.getDescent() + offsets[g.getBaseline()]);
    maxDL = max(maxDL, g.getDescent() + g.getLeading() +
                       offsets[g.getBaseline()]);
 }
 return maxDL - maxD;
 

返回:
TextLayout 的行距。

getBounds

public Rectangle2D getBounds()
返回此 TextLayout 的边界。边界包含 TextLayout 可以绘制的所有像素。它不可能与 TextLayout 的 ascent、descent、origin 或 advance 完全一致。

返回:
Rectangle2D,它是此 TextLayout 的边界。

isLeftToRight

public boolean isLeftToRight()
如果此 TextLayout 的基本方向是从左到右,则返回 true;如果基本方向是从右到左,则返回 falseTextLayout 具有从左到右 (LTR) 或从右到左 (RTL) 的基本方向。基本方向与行中文本的实际方向无关,可以是 LTR、RTL 或混向。默认情况下,从左到右布局按左对齐来定位。如果布局在制表行上进行,由于制表符是从左到右,因此逻辑连续布局的定位是从左到右。对于 RTL 布局则相反。默认情况下,它们是按左对齐来定位的,并且制表符是从右到左。

返回:
如果此 TextLayout 的基本方向是从左到右,则返回 true;否则返回 false

isVertical

public boolean isVertical()
如果此 TextLayout 是垂直的,则返回 true

返回:
如果此 TextLayout 是垂直到处,则返回 true;否则返回 false

getCharacterCount

public int getCharacterCount()
返回由此 TextLayout 表示的字符数。

返回:
TextLayout 中的字符数。

getCaretInfo

public float[] getCaretInfo(TextHitInfo hit,
                            Rectangle2D bounds)
返回与对应于 hit 的插入符有关的信息。数组的第一个元素是此插入符与基线的交集。数组的第二个元素是插入符的反斜面(排列/上升)。

此方法仅用于获取信息。要显示插入符,最好使用 getCaretShapes

参数:
hit - 此 TextLayout 中的目标字符
bounds - 构造插入符位置的边界
返回:
包含插入符的位置和斜面的两个元素的数组
另请参见:
getCaretShapes(int, Rectangle2D, TextLayout.CaretPolicy), Font.getItalicAngle()

getCaretInfo

public float[] getCaretInfo(TextHitInfo hit)
返回与对应于 hit 的插入符有关的信息。此方法是 getCaretInfo 的便捷用法,它使用了此 TextLayout 的自然边界。

参数:
hit - 此 TextLayout 中的目标字符
返回:
有关相应于目标字符的插入符的信息。

getNextRightHit

public TextHitInfo getNextRightHit(TextHitInfo hit)
返回下一个插入符右侧(底部)的目标字符;如果没有这种字符,则返回 null。如果目标字符索引超出范围,则抛出 IllegalArgumentException

参数:
hit - 此布局中的目标字符
返回:
其插入符显示在所提供目标字符的插入符右侧(底部)下一个位置处的目标字符,或者返回 null

getNextRightHit

public TextHitInfo getNextRightHit(int offset,
                                   TextLayout.CaretPolicy policy)
返回下一个插入符右侧(底部)的目标字符;如果没有这种字符,则返回 null。目标字符位于指定偏移量处根据指定策略确定的强插入符的右侧。返回的目标字符是根据指定策略确定的两个可能目标字符中较强的一个。

参数:
offset - 此 TextLayout 中的插入偏移量。不能小于 0 或大于此 TextLayout 对象的字符计数。
policy - 用来选择强插入符的策略
返回:
其插入符显示在所提供目标字符的插入符右侧(底部)下一个位置处的目标字符,或者返回 null

getNextRightHit

public TextHitInfo getNextRightHit(int offset)
返回下一个插入符右侧(底部)的目标字符;如果没有这种字符,则返回 null。目标字符位于指定偏移量处根据默认策略确定的强插入符的右侧。返回的目标字符是根据默认策略确定的两个可能目标字符中较强的一个。

参数:
offset - 此 TextLayout 中的插入偏移量。不能小于 0 或大于该 TextLayout 对象的字符计数。
返回:
其插入符显示在所提供目标字符的插入符右侧(底部)下一个位置处的目标字符,或者返回 null

getNextLeftHit

public TextHitInfo getNextLeftHit(TextHitInfo hit)
返回下一个插入符左侧(顶部)的目标字符;如果没有这种字符,则返回 null。如果目标字符索引超出范围,则抛出 IllegalArgumentException

参数:
hit - 此 TextLayout 中的目标字符。
返回:
其插入符显示在所提供目标字符的插入符左侧(顶部)下一个位置处的目标字符,或者返回 null

getNextLeftHit

public TextHitInfo getNextLeftHit(int offset,
                                  TextLayout.CaretPolicy policy)
返回下一个插入符左侧(顶部)的目标字符;如果没有这种字符,则返回 null。目标字符位于指定偏移量处根据指定策略确定的强插入符的左侧。返回的目标字符是根据指定策略确定的两个可能目标字符中较强的一个。

参数:
offset - 此 TextLayout 中的插入偏移量。不能小于 0 或大于此 TextLayout 对象的字符计数。
policy - 用来选择强插入符的策略
返回:
其插入符显示在所提供目标字符的插入符左侧(顶部)下一个位置处的目标字符,或者返回 null

getNextLeftHit

public TextHitInfo getNextLeftHit(int offset)
返回下一个插入符左侧(顶部)的目标字符;如果没有这种字符,则返回 null。目标字符位于指定偏移量处根据默认策略确定的强插入符的左侧。返回的目标字符是根据默认策略确定的两个可能目标字符中较强的一个。

参数:
offset - 此 TextLayout 中的插入偏移量。不能小于 0 或大于此 TextLayout 对象的字符计数。
返回:
其插入符显示在所提供目标字符的插入符左侧(顶部)下一个位置处的目标字符,或者返回 null

getVisualOtherHit

public TextHitInfo getVisualOtherHit(TextHitInfo hit)
返回位于指定目标字符的插入符另一侧的目标字符。

参数:
hit - 指定的目标字符
返回:
位于指定字符的插入符另一侧的目标字符。

getCaretShape

public Shape getCaretShape(TextHitInfo hit,
                           Rectangle2D bounds)
返回表示指定边界内指定目标字符处的插入符的 Shape

参数:
hit - 生成插入符处的目标字符
bounds - 用于生成插入符的 TextLayout 的边界。
返回:
表示插入符的 Shape

getCaretShape

public Shape getCaretShape(TextHitInfo hit)
返回表示此 TextLayout 的自然边界中指定目标字符处的插入符的 Shape

参数:
hit - 生成插入符处的目标字符
返回:
表示插入符的 Shape

getCharacterLevel

public byte getCharacterLevel(int index)
返回 index 处字符的级别。索引 -1 和 characterCount 被分配为此 TextLayout 的基本级别。

参数:
index - 获取其级别的字符的索引
返回:
指定 index 处的字符的级别。

getCaretShapes

public Shape[] getCaretShapes(int offset,
                              Rectangle2D bounds,
                              TextLayout.CaretPolicy policy)
返回对应于强插入符和弱插入符的两条路径。

参数:
offset - 此 TextLayout 中的偏移量
bounds - 插入符扩展到的边界
policy - 指定的 CaretPolicy
返回:
包含两条路径的数组。元素零是强插入符。如果有两个插入符,则索引为 1 的元素为弱插入符,否则为 null

getCaretShapes

public Shape[] getCaretShapes(int offset,
                              Rectangle2D bounds)
返回对应于强插入符和弱插入符的两条路径。此方法是使用默认插入符策略的 getCaretShapes 的便捷用法。

参数:
offset - 此 TextLayout 中的偏移量
bounds - 插入符扩展到的边界
返回:
对应于 DEFAULT_CARET_POLICY 定义的强插入符和弱插入符的两条路径。

getCaretShapes

public Shape[] getCaretShapes(int offset)
返回对应于强插入符和弱插入符的两条路径。此方法是 getCaretShapes 的便捷用法,后者使用默认插入符策略和此 TextLayout 对象的自然边界。

参数:
offset - 此 TextLayout 中的偏移量
返回:
对应于 DEFAULT_CARET_POLICY 定义的强插入符和弱插入符的两条路径。

getLogicalRangesForVisualSelection

public int[] getLogicalRangesForVisualSelection(TextHitInfo firstEndpoint,
                                                TextHitInfo secondEndpoint)
返回对应于可视选择范围的逻辑文本范围。

参数:
firstEndpoint - 可视范围的端点
secondEndpoint - 可视范围的另一个端点。此端点可以小于 firstEndpoint
返回:
表示所选范围的开始/限制对的整数数组。
另请参见:
getVisualHighlightShape(TextHitInfo, TextHitInfo, Rectangle2D)

getVisualHighlightShape

public Shape getVisualHighlightShape(TextHitInfo firstEndpoint,
                                     TextHitInfo secondEndpoint,
                                     Rectangle2D bounds)
返回封闭指定范围中扩展到 bounds 的可视选择范围的路径。

如果选择范围包括最左侧(最顶部)的位置,则选择范围将扩展到 bounds 的左侧(顶部)。如果选择范围包括最右侧(最底部)的位置,则选择范围将扩展到边界的右侧(底部)。选择范围的高度(垂直行上的宽度)始终扩展到 bounds

尽管选择范围始终是连续的,但逻辑选择文本在混向文本的行上可能是不连续的。所选文本的逻辑范围可以使用 getLogicalRangesForVisualSelection 检索。例如,假设文本 "ABCdef" 中的大写字母指示在从右到左的行上呈现的从右到左的文本,可视选择范围从 0L("A" 的开始边)到 3T("d" 的结尾边)。文本显示如下,粗体下划线区域表示选择范围:

    defCBA  
 
因为视觉上连续的文本在逻辑上是不连续的,所以逻辑选择范围为 0-3、4-6 (ABC, ef)。还请注意的是,由于选择了布局上最右侧的位置("A" 的右边),因此选择范围将扩展到边界的右侧。

参数:
firstEndpoint - 可视选择范围的端点
secondEndpoint - 可视选择范围的另一个端点
bounds - 选择范围扩展到的边界矩形
返回:
封闭选择范围的 Shape
另请参见:
getLogicalRangesForVisualSelection(TextHitInfo, TextHitInfo), getLogicalHighlightShape(int, int, Rectangle2D)

getVisualHighlightShape

public Shape getVisualHighlightShape(TextHitInfo firstEndpoint,
                                     TextHitInfo secondEndpoint)
返回封闭指定范围中扩展到指定边界的可视选择范围的 Shape。此方法是 getVisualHighlightShape 的便捷用法,后者使用了此 TextLayout 的自然边界。

参数:
firstEndpoint - 可视选择范围的端点
secondEndpoint - 可视选择范围的另一个端点
返回:
封闭选择范围的 Shape

getLogicalHighlightShape

public Shape getLogicalHighlightShape(int firstEndpoint,
                                      int secondEndpoint,
                                      Rectangle2D bounds)
返回封闭指定范围中扩展到指定 bounds 的逻辑选择范围的 Shape

如果选择范围包括第一个逻辑字符,则选择范围将扩展到此 TextLayout 的起点之前的 bounds 部分。如果该范围包括最后的逻辑字符,则选择范围将扩展到此 TextLayout 的结束点之后的 bounds 部分。选择范围的高度(垂直行上的宽度)始终扩展到 bounds

选择范围在混向文本的行上可能是不连续的。只有逻辑范围中开始和限制之间的那些字符显示为被选中。例如,假定文本 "ABCdef" 的大写字母表示在从右到左的行上呈现从右到左的文本,逻辑选择范围是从 0 到 4 ('ABCd')。文本显示如下,粗体表示选择范围,下划线表示扩展:

    defCBA  
 
选择的字符在视觉上是不连续的,该选择范围是不连续的。还请注意的是,由于该范围包括第一个逻辑字符 (A),所以该选择范围将扩展到布局开始之前的 bounds 部分,在本例中(从右到左的行)是 bounds 的右半部。

参数:
firstEndpoint - 选择的字符范围的端点
secondEndpoint - 选择的字符范围的另一个端点。可以小于 firstEndpoint。此范围包括 min(firstEndpoint, secondEndpoint) 处的字符,但不包括 max(firstEndpoint, secondEndpoint) 处的字符。
bounds - 选择范围扩展到的边界矩形
返回:
封闭该选择范围的区域。
另请参见:
getVisualHighlightShape(TextHitInfo, TextHitInfo, Rectangle2D)

getLogicalHighlightShape

public Shape getLogicalHighlightShape(int firstEndpoint,
                                      int secondEndpoint)
返回封闭指定范围中逻辑选择范围的 Shape,它扩展到了此 TextLayout 的自然边界。此方法是 getLogicalHighlightShape 的便捷用法,后者使用了此 TextLayout 的自然边界。

参数:
firstEndpoint - 选择的字符范围的端点
secondEndpoint - 选择的字符范围的另一个端点。可以小于 firstEndpoint。此范围包括 min(firstEndpoint, secondEndpoint) 处的字符,但不包括 max(firstEndpoint, secondEndpoint) 处的字符。
返回:
封闭选择范围的 Shape

getBlackBoxBounds

public Shape getBlackBoxBounds(int firstEndpoint,
                               int secondEndpoint)
返回指定范围中字符的黑框边界。黑框边界是对应于开始和限制之间的字符的所有字形的边界框的并集。此路径可以不相交。

参数:
firstEndpoint - 字符范围的端点
secondEndpoint - 字符范围的另一个端点。可以小于 firstEndpoint
返回:
封闭黑框边界的 path

hitTestChar

public TextHitInfo hitTestChar(float x,
                               float y,
                               Rectangle2D bounds)
返回对应于指定点的 TextHitInfo。将 TextLayout 边界之外的坐标映射到第一个逻辑字符开始边上的点,或映射到最后一个逻辑字符的结束边上的点(如果合适),而不管该字符在行中的位置。该方法只使用基线方向。

参数:
x - 距离此 TextLayout 的原点的 x 偏移量
y - 距离此 TextLayout 的原点的 y 偏移量
bounds - TextLayout 的边界
返回:
描述指定点处字符和边缘(开始边或结尾边)的 TextHitInfo。

hitTestChar

public TextHitInfo hitTestChar(float x,
                               float y)
返回对应于指定点的 TextHitInfo。此方法是 hitTestChar 的便捷用法,后者使用了此 TextLayout 的自然边界。

参数:
x - 距离此 TextLayout 的原点的 x 偏移量
y - 距离此 TextLayout 的原点的 y 偏移量
返回:
描述指定点下字符和边缘(开始边或结尾边)的 TextHitInfo。

hashCode

public int hashCode()
返回此 TextLayout 的哈希码。

覆盖:
Object 中的 hashCode
返回:
TextLayout 的哈希码。
另请参见:
Object.equals(java.lang.Object), Hashtable

equals

public boolean equals(Object obj)
如果指定 Object 是一个 TextLayout 对象,且指定的 Object 等于此 TextLayout,则返回 true

覆盖:
Object 中的 equals
参数:
obj - 用于测试等同性的 Object
返回:
如果指定的 Object 等于此 TextLayout,则返回 true;否则返回 false
另请参见:
Object.hashCode(), Hashtable

equals

public boolean equals(TextLayout rhs)
如果两个布局相等,则返回 true。如果两个布局包含具有相同顺序的相等字形向量,则这两个布局相等。

参数:
rhs - 与此 TextLayout 进行比较的 TextLayout
返回:
如果指定的 TextLayout 等于此 TextLayout,则返回 true

toString

public String toString()
返回此 TextLayout 的调试信息。

覆盖:
Object 中的 toString
返回:
TextLayoutString 形式的 textLine

draw

public void draw(Graphics2D g2,
                 float x,
                 float y)
在指定的 Graphics2D 上下文中的指定位置上呈现此 TextLayout。布局的原点置于 x, y。呈现可能涉及此位置的 getBounds() 中的任何点。此方法不改变 g2

参数:
g2 - 呈现布局的 Graphics2D 上下文
x, y - 此 TextLayout 的原点坐标
另请参见:
getBounds()

getOutline

public Shape getOutline(AffineTransform tx)
返回表示此 TextLayout 的轮廓的 Shape

参数:
tx - 应用于此 TextLayout 轮廓的可选 AffineTransform
返回:
TextLayout 的轮廓的 Shape

JavaTM 2 Platform
Standard Ed. 5.0

提交错误或意见
有关更多的 API 参考资料和开发人员文档,请参阅 Java 2 SDK SE 开发人员文档。该文档包含更详细的、面向开发人员的描述,以及总体概述、术语定义、使用技巧和工作代码示例。

版权所有 2004 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策