|
|||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
java.awt.font
类 TextLayout
java.lang.Object java.awt.font.TextLayout
- 所有已实现的接口:
- Cloneable
TextLayout
是样式字符数据的不可变图形表示形式。
它提供以下功能:
- 隐式双向分析和重排序,
- 光标定位和移动,包括针对混向文本的拆分光标,
- 突出显示,包括针对混向文本的逻辑突出显示和可视突出显示,
- 多个 baseline(罗马字体、悬挂和居中),
- 命中测试,
- 调整,
- 默认字体替换,
- 规格信息,如 ascent、descent 和 advance 以及
- 呈现
TextLayout
对象可以使用其 draw
方法呈现。
可以直接构造 TextLayout
或通过使用 LineBreakMeasurer
构造它。直接进行构造时,源文本表示一个段落。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.
嵌套类摘要 | |
---|---|
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 的一个副本。 |
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)
-
根据
String
和Font
构造一个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()
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