Swing/Tracking のバックアップ(No.4)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/Tracking へ行く。
- 1 (2020-08-17 (月) 00:42:15)
- 2 (2022-01-09 (日) 02:01:34)
- 3 (2022-09-19 (月) 09:45:21)
- 4 (2023-04-10 (月) 04:23:24)
- category: swing folder: Tracking title: Fontにトラッキングを設定して文字列幅を詰めて描画する tags: [Font, TextAttribute, JLabel] author: aterai pubdate: 2020-08-17T00:41:09+09:00 description: Fontに負のトラッキング値(字送り、文字間)を設定して文字列幅を縮小して描画します。 image: https://drive.google.com/uc?id=1KrgIAqBBGNrvhJlqL9rWcKfeuNkTCktC
概要
Font
に負のトラッキング値(字送り、文字間)を設定して文字列幅を縮小して描画します。
Screenshot
Advertisement
サンプルコード
protected Shape getTextShape(Graphics2D g2) {
String txt = getText();
Map<TextAttribute, Object> attr = new ConcurrentHashMap<>();
attr.put(TextAttribute.TRACKING, -.1f);
Font font = txt.length() < 3 ? g2.getFont() : g2.getFont().deriveFont(attr);
FontRenderContext frc = g2.getFontRenderContext();
return new TextLayout(txt, font, frc).getOutline(null);
}
View in GitHub: Java, Kotlin解説
Default (0)
- トラッキングのデフォルトは
0
- トラッキングのデフォルトは
TRACKING_TIGHT (-.04f)
- 密なトラッキングで実際の値は
-0.04f
- 密なトラッキングで実際の値は
TRACKING_LOOSE (.04f)
- 疎なトラッキングで実際の値は
0.04f
- 疎なトラッキングで実際の値は
Scaled along the X axis direction: 0.95
3
文字以上の場合AffineTransform.getScaleInstance(.95, 1d)
で文字幅に95%
の長体をかけたフォントをFont#deriveFont(AffineTransform)
で複製して使用- 参考: Fontに長体をかけてJTextAreaで使用する、JLabel内のアイコンにJLayerを使用してバッジを表示する
Tracking: -0.1
3
文字以上の場合Map#put(TextAttribute.TRACKING, -.1f)
で字送りを10%
詰めたフォントをFont#deriveFont(Map<? extends Attribute, ?>)
で複製して使用- TextAttribute.TRACKING (Java Platform SE 8)のドキュメントには「トラッキング値の範囲は通常
-0.1
から0.3
で、この範囲外の値は一般的に望ましくありません。」と記述されている
- TextAttribute.TRACKING (Java Platform SE 8)のドキュメントには「トラッキング値の範囲は通常
TextAttribute.KERNING
をTextAttribute.KERNING_ON
にして文字詰めする方法もあるが、フォントに欧文ペアカーニング情報が含まれていない場合は効果がない
参考リンク
- TextAttribute.TRACKING (Java Platform SE 8)
- Fontに長体をかけてJTextAreaで使用する
- JLabel内のアイコンにJLayerを使用してバッジを表示する
- swing - Java 2d drawString irregular letter spacing - Stack Overflow
- [JDK-8165943] LineBreakMeasurer does not measure correctly if TextAttribute.TRACKING is set. - Java Bug System