模块 java.desktop

类 TextLayout

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

public final class TextLayout extends Object implements Cloneable
TextLayout 是样式化字符数据的不可变图形表示。

它提供以下功能:

  • 隐式双向分析和重新排序,
  • 光标定位和移动,包括混合方向文本的拆分光标,
  • 突出显示,包括混合方向文本的逻辑和视觉突出显示,
  • 多个基线(罗马、悬挂和居中),
  • 命中测试,
  • 理由,
  • 默认字体替换,
  • 度量信息,例如上升、下降和前进,以及
  • rendering

TextLayout 对象可以使用其 draw 方法进行渲染。

TextLayout 可以直接构造,也可以通过使用 LineBreakMeasurer 构造。直接构造时,源文本表示单个段落。 LineBreakMeasurer 允许将带样式的文本分成适合特定宽度的行。有关详细信息,请参阅 LineBreakMeasurer 文档。

TextLayout 构造的逻辑过程如下:

  • 段落属性被提取和检查,
  • 分析文本以进行双向重新排序,并在需要时计算重新排序信息,
  • 文本被分割成样式运行
  • 为样式运行选择字体,如果属性TextAttribute.FONT 存在,首先使用字体,否则通过使用已定义的属性计算默认字体
  • 如果文本在多个基线上,运行或子运行将进一步分解为共享公共基线的子运行,
  • 使用所选字体为每次运行生成字形向量,
  • 对字形向量执行最终的双向重新排序

TextLayout 对象的方法返回的所有图形信息都相对于 TextLayout 的原点,这是 TextLayout 对象的基线与其左边缘的交点。此外,传递给 TextLayout 对象方法的坐标被假定为相对于 TextLayout 对象的原点。客户端通常需要在 TextLayout 对象的坐标系和另一个对象(例如 Graphics 对象)的坐标系之间进行转换。

TextLayout 对象由带样式的文本构成,但它们不保留对其源文本的引用。因此,先前用于生成 TextLayout 的文本的更改不会影响 TextLayout

TextLayout 对象的三个方法(getNextRightHitgetNextLeftHithitTestChar)返回 TextHitInfo 的实例。这些 TextHitInfo 对象中包含的偏移量是相对于 TextLayout 的开始的,not到用于创建 TextLayout 的文本。同样,接受 TextHitInfo 实例作为参数的 TextLayout 方法期望 TextHitInfo 对象的偏移量是相对于 TextLayout 的,而不是任何底层文本存储模型。

Examples :

构建并绘制一个 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 translated 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.
 

注意:字体旋转会导致文本基线旋转,多次运行不同的旋转会导致基线弯曲或锯齿形。为了考虑到这种(罕见的)可能性,一些 API 被指定为返回指标并采用“在基线相对坐标中”(例如上升、前进)的参数,而其他 API 在“标准坐标”中(例如 getBounds)。基线相对坐标中的值将“x”坐标映射到沿基线的距离(正 x 沿基线向前),“y”坐标映射到沿垂直于“x”处基线的距离(正y 是从基线矢量顺时针旋转 90 度)。标准坐标中的值沿 x 和 y 轴测量,0,0 位于 TextLayout 的原点。每个相关 API 的文档都指出什么值在什么坐标系中。一般来说,测量相关的API是在基线相对坐标中,而显示相关的API是在标准坐标中。

参见:
  • 字段详细信息

    • 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 的副本。
      重写:
      clone 在类 Object
      返回:
      此实例的克隆。
      参见:
    • getJustifiedLayout

      public TextLayout  getJustifiedLayout(float justificationWidth)
      创建此 TextLayout 的副本,对齐指定宽度。

      如果这个 TextLayout 已经被证明是合理的,则抛出异常。如果此 TextLayout 对象的调整比为零,则返回与此 TextLayout 相同的 TextLayout

      参数:
      justificationWidth - 对齐线时使用的宽度。为了获得最佳效果,它不应与线路当前的推进相差太大。
      返回:
      a TextLayout 对齐到指定的宽度。
      抛出:
      Error - 如果此布局已被证明是合理的,则会引发错误。
    • handleJustify

      protected void handleJustify(float justificationWidth)
      证明这个布局。被子类重写以控制对齐(如果有子类,那就是......)只有段落属性(来自源文本,可能由布局属性默认)指示非零对齐比率时,布局才会对齐。文本将对齐到指定的宽度。当前的实现还调整了悬挂标点符号和尾随空格以突出对齐宽度。一旦合理化,布局可能无法重新合理化。

      一些代码可能依赖于布局的不变性。子类不应直接调用此方法,而应调用 getJustifiedLayout,它会在此布局的克隆上调用此方法,同时保留原始布局。

      参数:
      justificationWidth - 对齐线时使用的宽度。为了获得最佳效果,它不应与线路当前的推进相差太大。
      参见:
    • getBaseline

      public byte getBaseline()
      返回此 TextLayout 的基线。基线是 Font 中定义的值之一,它们是罗马的、居中的和悬挂的。上升和下降是相对于这个基线的。 baselineOffsets 也与此基线相关。
      返回:
      这个 TextLayout 的基线。
      参见:
    • getBaselineOffsets

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

      该数组由 Font 中定义的值之一索引,这些值是罗马的、居中的和悬挂的。这些值是相对于此 TextLayout 对象的基线的,因此 getBaselineOffsets[getBaseline()] == 0 。将偏移量添加到 TextLayout 对象基线的位置以获得新基线的位置。

      返回:
      包含用于此 TextLayout 的基线的偏移量数组。
      参见:
    • getAdvance

      public float getAdvance()
      返回此 TextLayout 的预付款。 advance 是从原点到最右边(最底部)字符的 advance 的距离。这是在基线相对坐标中。
      返回:
      这个 TextLayout 的进步。
    • getVisibleAdvance

      public float getVisibleAdvance()
      返回此 TextLayout 减去尾随空格的前进。这是在基线相对坐标中。
      返回:
      这个 TextLayout 的前进没有尾随空格。
      参见:
    • getAscent

      public float getAscent()
      返回此 TextLayout 的上升。上升是从 TextLayout 的顶部(右侧)到基线的距离。它始终为正或零。 ascent 足以容纳上标文本,并且是每个字形的 ascent、offset 和 baseline 之和的最大值。 ascent 是 TextLayout 中所有文本从基线开始的最大上升。它位于基线相对坐标中。
      返回:
      这个TextLayout的上升。
    • getDescent

      public float getDescent()
      返回此 TextLayout 的血统。下降是从基线到 TextLayout 底部(左侧)的距离。它始终为正或零。下降足以容纳下标文本,并且是每个字形的下降、偏移和基线之和的最大值。这是 TextLayout 中所有文本从基线开始的最大下降。它位于基线相对坐标中。
      返回:
      这个 TextLayout 的血统。
    • getLeading

      public float getLeading()
      返回 TextLayout 的前导。前导是此 TextLayout 的建议行间距。这是在基线相对坐标中。

      前导是根据 TextLayout 中所有字形向量的前导、下降和基线计算得出的。算法大致如下:

       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 的上升、下降、原点或推进不完全一致。
      返回:
      一个 Rectangle2D 是这个 TextLayout 的边界。
    • getPixelBounds

      public Rectangle  getPixelBounds(FontRenderContext  frc, float x, float y)
      返回在给定位置处具有给定 FontRenderContext 的图形中呈现时此 TextLayout 的像素边界。图形渲染上下文不必与用于创建此 TextLayoutFontRenderContext 相同,并且可以为空。如果为空,则使用此 TextLayoutFontRenderContext
      参数:
      frc - GraphicsFontRenderContext
      x - 渲染此 TextLayout 的 x 坐标。
      y - 渲染此 TextLayout 的 y 坐标。
      返回:
      a Rectangle 限制会受影响的像素。
      自从:
      1.6
      参见:
    • isLeftToRight

      public boolean isLeftToRight()
      如果此 TextLayout 具有从左到右的基本方向,则返回 true;如果它具有从右到左的基本方向,则返回 falseTextLayout 的基本方向为从左到右 (LTR) 或从右到左 (RTL)。基本方向独立于行上文本的实际方向,可以是 LTR、RTL 或混合方向。默认情况下,从左到右的布局应该向左对齐。如果布局位于标签行上,则标签从左到右排列,因此逻辑上连续的布局从左到右。 RTL 布局则相反。默认情况下,它们应该向左对齐,并且选项卡从右到左运行。
      返回:
      true 如果这个 TextLayout 的基本方向是从左到右; false否则。
    • isVertical

      public boolean isVertical()
      如果这个 TextLayout 是垂直的,则返回 true
      返回:
      true 如果这个 TextLayout 是垂直的; false否则。
    • getCharacterCount

      public int getCharacterCount()
      返回此 TextLayout 表示的字符数。
      返回:
      TextLayout 中的字符数。
    • getCaretInfo

      public float[] getCaretInfo(TextHitInfo  hit, Rectangle2D  bounds)
      返回有关对应于 hit 的插入符号的信息。数组的第一个元素是插入符号与基线的交点,表示为沿基线的距离。数组的第二个元素是插入符号的反斜率(运行/上升),相对于该点的基线进行测量。

      此方法仅供参考。要显示插入符,最好使用 getCaretShapes

      参数:
      hit - 命中此 TextLayout 中的一个角色
      bounds - 构建插入符信息的范围。边界位于基线相对坐标中。
      返回:
      包含插入符号的位置和斜率的二元数组。返回的插入符信息位于基线相对坐标中。
      参见:
    • 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)
      返回一个 Shape 表示此 TextLayout 的自然边界内指定命中处的插入符号。
      参数:
      hit - 生成插入符号的命中
      返回:
      Shape 代表插入符号。返回的形状在标准坐标中。
    • getCharacterLevel

      public byte getCharacterLevel(int index)
      返回 index 处的角色等级。索引 -1 和 characterCount 被分配给这个 TextLayout 的基本级别。
      参数:
      index - 从中获取等级的角色的索引
      返回:
      指定索引处的字符级别。
    • getCaretShapes

      public Shape [] getCaretShapes(int offset, Rectangle2D  bounds, TextLayout.CaretPolicy  policy)
      返回对应于强插入符和弱插入符的两条路径。
      参数:
      offset - 此 TextLayout 中的偏移量
      bounds - 插入符号扩展到的范围。边界位于基线相对坐标中。
      policy - 指定的 CaretPolicy
      返回:
      两条路径的数组。元素零是强插入符号。如果有两个插入符,元素一是弱插入符,否则是 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

      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 包含选择。这是在标准坐标中。
      参见:
    • getVisualHighlightShape

      public Shape  getVisualHighlightShape(TextHitInfo  firstEndpoint, TextHitInfo  secondEndpoint)
      返回一个 Shape 包含指定范围内的视觉选择,扩展到边界。此方法是 getVisualHighlightShape 的便利重载,它使用此 TextLayout 的自然边界。
      参数:
      firstEndpoint - 视觉选择的一端
      secondEndpoint——视觉选择的另一端
      返回:
      一个 Shape 包含选择。这是在标准坐标中。
    • getLogicalHighlightShape

      public Shape  getLogicalHighlightShape(int firstEndpoint, int secondEndpoint, Rectangle2D  bounds)
      返回一个 Shape 包含指定范围内的逻辑选择,扩展到指定的 bounds

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

      在具有混合方向文本的行上,选择可以是不连续的。只有在 start 和 limit 之间的逻辑范围内的字符才会显示为选中。例如,考虑文本“ABCdef”,其中大写字母表示从右到左的文本,呈现在从右到左的行上,逻辑选择从 0 到 4 ('ABCd')。文本显示如下,粗体表示选择,下划线表示扩展名:

        defCBA 
       
      选择不连续,因为所选字符在视觉上不连续。另请注意,由于范围包括第一个逻辑字符 (A),因此选择会扩展到布局开始之前的 bounds 部分,在本例中(从右到左的行)是布局的右侧部分bounds
      参数:
      firstEndpoint - 要选择的字符范围内的端点
      secondEndpoint - 要选择的字符范围的另一个端点。可以小于 firstEndpoint 。该范围包括 min(firstEndpoint, secondEndpoint) 处的字符,但不包括 max(firstEndpoint, secondEndpoint)。
      bounds - 将选择扩展到的边界矩形。这是在基线相对坐标中。
      返回:
      包含所选内容的区域。这是在标准坐标中。
      参见:
    • 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
      返回:
      Shape 包含黑框边界。这是在标准坐标中。
    • hitTestChar

      public TextHitInfo  hitTestChar(float x, float y, Rectangle2D  bounds)
      返回指定点对应的TextHitInfoTextLayout 映射边界外的坐标命中第一个逻辑字符的前缘,或最后一个逻辑字符的后缘,视情况而定,无论该字符在行中的位置如何。仅沿基线的方向用于进行此评估。
      参数:
      x - 距此 TextLayout 原点的 x 偏移量。这是在标准坐标中。
      y - 距此 TextLayout 原点的 y 偏移量。这是在标准坐标中。
      bounds - TextLayout 的范围。这是在基线相对坐标中。
      返回:
      描述指定点下的字符和边缘(前导或尾随)的命中。
    • hitTestChar

      public TextHitInfo  hitTestChar(float x, float y)
      返回指定点对应的TextHitInfo。此方法是 hitTestChar 的便利重载,它使用此 TextLayout 的自然边界。
      参数:
      x - 距此 TextLayout 原点的 x 偏移量。这是在标准坐标中。
      y - 距此 TextLayout 原点的 y 偏移量。这是在标准坐标中。
      返回:
      描述指定点下的字符和边缘(前导或尾随)的命中。
    • equals

      public boolean equals(TextLayout  rhs)
      如果两个布局相等,则返回 true。遵守 equals(Object) 的总合同。
      参数:
      rhs - 与这个 TextLayout 比较的 TextLayout
      返回:
      true 如果指定的 TextLayout 等于此 TextLayout
    • toString

      public String  toString()
      返回此 TextLayout 的调试信息。
      重写:
      toString 在类 Object
      返回:
      这个 TextLayouttextLine 作为 String
    • draw

      public void draw(Graphics2D  g2, float x, float y)
      在指定的 Graphics2D 上下文中的指定位置呈现此 TextLayout。布局的原点位于 x, y。渲染可能会触及此位置getBounds() 内的任何点。这使 g2 保持不变。文本沿基线路径呈现。
      参数:
      g2 - 渲染布局的 Graphics2D 上下文
      x - 这个TextLayout原点的X坐标
      y - 这个TextLayout原点的Y坐标
      参见:
    • getOutline

      public Shape  getOutline(AffineTransform  tx)
      返回表示此 TextLayout 轮廓的 Shape
      参数:
      tx - 一个可选的 AffineTransform 应用于这个 TextLayout 的轮廓。
      返回:
      一个 Shape 就是这个 TextLayout 的轮廓。这是在标准坐标中。
    • getLayoutPath

      public LayoutPath  getLayoutPath()
      返回 LayoutPath,如果布局路径是默认路径(x 映射到前进,y 映射到偏移),则返回 null。
      返回:
      布局路径
      自从:
      1.6
    • hitToPoint

      public void hitToPoint(TextHitInfo  hit, Point2D  point)
      将命中转换为标准坐标中的点。该点位于字符的基线上,位于字符的前缘或后缘(视情况而定)。如果路径在命中所代表的角色的一侧断开,则该点将与该角色相邻。
      参数:
      hit - 要检查的命中。这必须是对 TextLayout 的有效点击。
      point - 返回点。该点位于标准坐标中。
      抛出:
      IllegalArgumentException - 如果命中对于 TextLayout 无效。
      NullPointerException - 如果命中或点为空。
      自从:
      1.6