Module java.desktop
Package java.awt.font

Class 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的构造逻辑如下:

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

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) {
       // 将图形转换为屏幕上的布局原点
       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应相对于布局,而不是源文本

   int selStart = ..., selLimit = ...;
   Color selectionColor = ...;
   Shape selection = layout.getLogicalHighlightShape(selStart, selLimit);
   // 选择可能由不连续的区域组成
   // 假定图形已转换为布局原点
   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]是第一个选择范围,
   // ranges[2], ranges[3]是第二个选择范围,依此类推
 

注意: 字体旋转可能导致文本基线被旋转,具有不同旋转的多个运行可能导致基线弯曲或之字形。为了考虑这种(罕见的)可能性,一些API被指定为返回度量并采用“基线相对坐标”参数(例如上升、前进),而其他API采用“标准坐标”(例如获取边界)。每个相关API的文档都指示哪些值属于哪个坐标系。一般来说,与测量相关的API采用基线相对坐标,而与显示相关的API采用标准坐标。

参见:
  • Field Details

    • DEFAULT_CARET_POLICY

      public static final TextLayout.CaretPolicy DEFAULT_CARET_POLICY
      当客户端未指定策略时,使用此CaretPolicy。使用此策略时,字符的方向与行方向相同的字符的插入符位置比反向字符的插入符位置更强。如果字符的方向相同,则字符前沿的插入符位置比字符后沿的插入符位置更强。
  • Constructor Details

    • 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和用户空间之间的转换。
  • Method Details

    • clone

      protected Object clone()
      创建此TextLayout的副本。
      覆盖:
      clone 在类 Object
      返回:
      此实例的克隆。
      另请参阅:
    • getJustifiedLayout

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

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

      参数:
      justificationWidth - 用于调整行的宽度。为获得最佳结果,它不应与当前行的前进差异太大。
      返回:
      宽度对齐到指定宽度的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的前进。前进是从原点到最右(最下)字符的前进距离。这是基线相对坐标中的距离。
      返回:
      TextLayout的前进。
    • getVisibleAdvance

      public float getVisibleAdvance()
      返回此TextLayout的前进,减去尾随空格。这是基线相对坐标中的距离。
      返回:
      TextLayout的前进,不包括尾随空格。
      另请参阅:
    • getAscent

      public float getAscent()
      返回此TextLayout的上升。上升是从TextLayout的顶部(右侧)到基线的距离。它始终为正值或零。上升足以容纳上标文本,并且是每个字形的上升、偏移和基线之和的最大值。上升是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相同,可以为null。如果为null,则使用此TextLayoutFontRenderContext
      参数:
      frc - GraphicsFontRenderContext
      x - 渲染此TextLayout的x坐标。
      y - 渲染此TextLayout的y坐标。
      返回:
      包围将受影响的像素的Rectangle
      自:
      1.6
      参见:
    • 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对应的插入符信息。数组的第一个元素是插入符与基线的交点,作为沿基线的距离。数组的第二个元素是插入符的倒数斜率(run/rise),相对于该点的基线测量。

      此方法用于信息用途。要显示插入符,最好使用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)
      返回表示此TextLayout的自然边界内指定点击处插入符的Shape
      参数:
      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的右侧(底部)。选择的高度(垂直线上的宽度)总是扩展到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

      在具有混合方向文本的行上,选择可以是不连续的。只有在开始和限制之间的逻辑范围内的字符才会被选择。例如,考虑文本'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
      返回:
      一个包围指定范围内字符的黑盒边界的Shape。这是标准坐标。
    • getBlackBoxBounds

      public Shape getBlackBoxBounds(int firstEndpoint, int secondEndpoint)
      返回指定范围内字符的黑盒边界。黑盒边界是由所有对应于开始和限制之间字符的所有字形的边界框的并集组成的区域。此区域可以是不连续的。
      参数:
      firstEndpoint - 字符范围的一个端点
      secondEndpoint - 字符范围的另一个端点。可以小于firstEndpoint
      返回:
      一个包围黑盒边界的Shape。这是标准坐标。
    • hitTestChar

      public TextHitInfo hitTestChar(float x, float y, Rectangle2D bounds)
      返回与指定点对应的TextHitInfo。超出TextLayout边界的坐标将映射到第一个逻辑字符的前沿或最后一个逻辑字符的后沿的击中点,无论该字符在行中的位置如何。仅使用沿基线的方向进行此评估。
      参数:
      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
      返回:
      如果指定的TextLayout等于此TextLayout,则返回true
    • 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 - 可选的要应用于此TextLayout轮廓的AffineTransform
      返回:
      一个Shape,即此TextLayout的轮廓。这是标准坐标。
    • getLayoutPath

      public LayoutPath getLayoutPath()
      返回布局路径,如果布局路径是默认路径(x映射到advance,y映射到offset),则返回null。
      返回:
      布局路径
      自版本:
      1.6
    • hitToPoint

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