java.lang.Object java.awt.font.TextLayout
TextLayout
是样式字符数据的不可变图形表示形式。
它提供以下功能:
TextLayout
对象可以使用其 draw
方法呈现。
可以直接或通过使用 LineBreakMeasurer
构造 TextLayout
。直接构造时,源文本表示一个段落。LineBreakMeasurer
允许带样式的文本断行,以适应特定的宽度。有关更多信息,请参阅 LineBreakMeasurer
文档。
TextLayout
的逻辑构造过程如下:
TextAttribute.FONT
属性,则首先使用该字体,否则,通过使用已定义的属性计算默认字体 从 TextLayout
对象的方法返回的所有图形信息都相对于 TextLayout
的原点,它是 TextLayout
对象的基线与其左边缘的交叉点。同样,假定传递到 TextLayout
对象方法的坐标也相对于 TextLayout
对象的原点。客户端通常需要在 TextLayout
对象的坐标系和另一对象(如 Graphics
对象)中的坐标系之间进行转换。
根据样式文本创建 TextLayout
对象,但它们不保留对其源文本的引用。因此,对先前用来生成 TextLayout
文本的改动不会影响 TextLayout
。
TextLayout
对象的三个方法(getNextRightHit
、getNextLeftHit
和 hitTestChar
)都返回 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.
注:字体旋转可能导致文本基线旋转,多次进行不同的旋转可能够导致基线弯曲或出现 Z 形转角。为了处理好这种(少有的)可能性,需要指定一些 API 返回规格,并采用“相对于基线的坐标中”的参数(比如 ascent 和 advance),以及其他一些“标准坐标中”的规格和参数(比如 getBounds)。相对于基线的坐标中的值将 'x' 坐标映射到沿基线的某段距离处(正 x 表示沿基线的正方向),将 'y' 坐标映射到 'x' 坐标处基线垂直方向的某段距离处(正 y 表示从基线向量顺时针旋转 90 度)。标准坐标中的值是沿 x 轴和 y 轴进行测量的,0,0 是 TextLayout 的原点。用于每个相关 API 的文档都将指示哪些值位于坐标系中。通常,与测量有关的 API 位于与相对于基线的坐标中,而与显示有关的 API 则位于标准坐标中。
嵌套类摘要 | |
---|---|
static class |
TextLayout.CaretPolicy 定义确定强插入符位置的策略。 |
字段摘要 | |
---|---|
static TextLayout.CaretPolicy |
DEFAULT_CARET_POLICY 客户端未指定策略时使用此 CaretPolicy 。 |
构造方法摘要 | |
---|---|
TextLayout(AttributedCharacterIterator text, FontRenderContext frc) 根据样式文本上的迭代器构造一个 TextLayout 。 |
|
TextLayout(String string, Font font, FontRenderContext frc) 根据 String 和 Font 构造一个 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 的一个副本。 |
LayoutPath |
getLayoutPath() 返回 LayoutPath,如果布局路径是默认路径(x 映射到 advance,y 映射到 offset),则返回 null。 |
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 。 |
Rectangle |
getPixelBounds(FontRenderContext frc, float x, float y) 返回在图形中使用给定 FontRenderContext 在给定位置处呈现 TextLayout 时的像素边界。 |
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 。 |
void |
hitToPoint(TextHitInfo hit, Point2D point) 将一个命中点转换为标准坐标中的一个点。 |
boolean |
isLeftToRight() 如果此 TextLayout 的基本方向是从左到右,则返回 true ;如果基本方向是从右到左,则返回 false 。 |
boolean |
isVertical() 如果此 TextLayout 是垂直的,则返回 true 。 |
String |
toString() 返回此 TextLayout 的调试信息。 |
从类 java.lang.Object 继承的方法 |
---|
finalize, getClass, notify, notifyAll, wait, wait, wait |
字段详细信息 |
---|
public static final TextLayout.CaretPolicy DEFAULT_CARET_POLICY
CaretPolicy
。使用此策略,方向与行方向相同的字符的命中要强于对反方向字符的命中。如果字符的方向相同,则对字符开始边的命中要强于对字符结尾边的命中。
构造方法详细信息 |
---|
public TextLayout(String string, Font font, FontRenderContext frc)
String
和
Font
构造一个
TextLayout
。使用指定的
Font
样式化所有文本。
String
必须指定单个文本段,因为双向算法需要整个段落。
string
- 要显示的文本
font
- 用于样式化文本的
Font
frc
- 包含关于正确测量文本所需图形设备的信息。根据设备分辨率和属性(如抗锯齿)的不同,文本测量可能稍有变化。此参数未指定
TextLayout
和用户空间之间的转换。
public TextLayout(String string, Map<? extends AttributedCharacterIterator.Attribute,?> attributes, FontRenderContext frc)
String
和属性集构造一个
TextLayout
。
使用提供的属性样式化所有文本。
String
必须指定单个文本段,因为双向算法需要整个段落。
string
- 要显示的文本
attributes
- 用于样式化文本的属性
frc
- 包含关于正确测量文本所需图形设备的信息。根据设备分辨率和属性(如抗锯齿)的不同,文本测量可能稍有变化。此参数未指定
TextLayout
和用户空间之间的转换。
public TextLayout(AttributedCharacterIterator text, FontRenderContext frc)
TextLayout
。
该迭代器必须指定单个文本段,因为双向算法需要整个段落。
text
- 要显示的样式文本
frc
- 包含关于正确测量文本所需图形设备的信息。根据设备分辨率和属性(如抗锯齿)的不同,文本测量可能稍有变化。此参数未指定
TextLayout
和用户空间之间的转换。
方法详细信息 |
---|
protected Object clone()
public TextLayout getJustifiedLayout(float justificationWidth)
TextLayout
的一个副本。
如果已调整了此 TextLayout
,则抛出异常。如果此 TextLayout
对象的调整率为零,将返回与此 TextLayout
相同的 TextLayout
。
justificationWidth
- 调整行时使用的宽度。要获得最佳结果,该宽度与行的当前 advance 不应有太大差别。
TextLayout
。
Error
- 如果已调整了此布局,则抛出 Error。
protected void handleJustify(float justificationWidth)
某些代码依赖于布局的不可变性。因此子类不应直接调用该方法,而应调用 getJustifiedLayout,getJustifiedLayout 将在此布局的副本上调用此方法,并保留原始布局。
justificationWidth
- 调整行时使用的宽度。要获得最佳结果,该宽度与行的当前 advance 不应有太大差别。
getJustifiedLayout(float)
public byte getBaseline()
TextLayout
的基线。基线是
Font
中定义的一个值,它可以是 roman、centered 或 hanging。Ascent 和 descent 相对于此基线。
baselineOffsets
也相对于此基线。
TextLayout
的基线。
getBaselineOffsets()
,
Font
public float[] getBaselineOffsets()
TextLayout
的基线偏移量数组。
该数组用 Font
中定义的 roman、centered 或 hanging 值之一进行索引。这些值相对于此 TextLayout
对象的基线,从而 getBaselineOffsets[getBaseline()] == 0
。将偏移量添加到 TextLayout
对象基线所在的位置,以获取新基线的位置。
TextLayout
基线的偏移量数组。
getBaseline()
,
Font
public float getAdvance()
TextLayout
的 advance。该 advance 是从原点到最右边(最底部)字符的 advance 的距离。返回值位于相对于基线的坐标中。
TextLayout
的 advance。
public float getVisibleAdvance()
TextLayout
的 advance,减去结尾空格。返回值位于相对于基线的坐标中。
TextLayout
的 advance,不包括结尾的空格。
getAdvance()
public float getAscent()
TextLayout
的 ascent。ascent 是从
TextLayout
的顶端(右端)到基线的距离。它始终为正数或零。ascent 足以容纳上标文本,它是每个字形的 ascent、偏移量和基线总和的最大值。该 ascent 是 TextLayout 中所有文本基线的最大 ascent。返回值位于相对于基线的坐标中。
TextLayout
的 ascent。
public float getDescent()
TextLayout
的 descent。descent 是从基线到
TextLayout
底部(左端)的距离。它始终为正数或零。descent 足以容纳下标文本,它是每个字形的 descent、偏移量和基线总和的最大值。该 ascent 是 TextLayout 中所有文本基线的最大 descent。返回值位于相对于基线的坐标中。
TextLayout
的 descent。
public float getLeading()
TextLayout
的行距。行距是此
TextLayout
的建议行间距。返回值位于相对于基线的坐标中。
行距通过 TextLayout
中所有字形向量的行距、descent 和基线计算。算法大致如下:
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
的行距。
public Rectangle2D getBounds()
TextLayout
的边界。这些边界位于标准坐标中。因为光栅化效果,这些边界可能没有封装 TextLayout 呈现的所有像素。它可能与
TextLayout
的 ascent、descent、origin 或 advance 并不完全一致。
TextLayout
边界的
Rectangle2D
。
public Rectangle getPixelBounds(FontRenderContext frc, float x, float y)
FontRenderContext
在给定位置处呈现
TextLayout
时的像素边界。图形呈现上下文不必与用来创建此
TextLayout
的
FontRenderContext
相同,并且可以为 null。如果为 null,则使用此
TextLayout
的
FontRenderContext
。
frc
-
Graphics
的
FontRenderContext
。
x
- 呈现此
TextLayout
处的 x 坐标。
y
- 呈现此
TextLayout
处的 y 坐标。
Rectangle
。
GlyphVector.getPixelBounds(java.awt.font.FontRenderContext, float, float)
public boolean isLeftToRight()
TextLayout
的基本方向是从左到右,则返回
true
;如果基本方向是从右到左,则返回
false
。
TextLayout
的基本方向是从左到右 (LTR) 或从右到左 (RTL)。基本方向与行中文本的实际方向无关,实际方向可以是 LTR、RTL 或混向。默认情况下,从左到右布局按左对齐来定位。如果布局在制表行上进行,那么制表符将从左到右,从而逻辑连续布局的定位将从左到右。对于 RTL 布局则相反。默认情况下,它们是按左对齐来定位的,制表符将从右到左。
TextLayout
的基本方向是从左到右,则返回
true
;否则返回
false
。
public boolean isVertical()
TextLayout
是垂直的,则返回
true
。
TextLayout
是垂直的,则返回
true
;否则返回
false
。
public int getCharacterCount()
TextLayout
表示的字符数。
TextLayout
中的字符数。
public float[] getCaretInfo(TextHitInfo hit, Rectangle2D bounds)
hit
的插入符有关的信息。数组的第一个元素是插入符与基线的交集,它是沿基线的一段距离。数组的第二个元素是插入符的反斜面(排列/上升),它是根据位于该点的基线进行测量的。
此方法仅用于获取信息。要显示插入符,最好使用 getCaretShapes
。
hit
- 此
TextLayout
中的目标字符
bounds
- 构造插入符位置的边界。这些边界位于相对于基线的坐标中。
getCaretShapes(int, Rectangle2D, TextLayout.CaretPolicy)
,
Font.getItalicAngle()
public float[] getCaretInfo(TextHitInfo hit)
hit
的插入符有关的信息。此方法是
getCaretInfo
的便捷用法,它使用了此
TextLayout
的自然边界。
hit
- 此
TextLayout
中的目标字符
public TextHitInfo getNextRightHit(TextHitInfo hit)
null
。如果目标字符索引超出范围,则抛出
IllegalArgumentException
。
hit
- 此布局中的目标字符
null
。
public TextHitInfo getNextRightHit(int offset, TextLayout.CaretPolicy policy)
null
。目标字符位于指定偏移量处根据指定策略确定的强插入符右侧。返回的目标字符是根据指定策略确定的两个可能目标字符中较强的一个。
offset
- 此
TextLayout
中的插入偏移量。不能小于 0 或大于此
TextLayout
对象的字符