Swing/LineSplittingLabel のバックアップ(No.12)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/LineSplittingLabel へ行く。
- 1 (2012-12-18 (火) 19:20:59)
- 2 (2012-12-19 (水) 01:49:44)
- 3 (2013-05-24 (金) 17:29:32)
- 4 (2014-11-22 (土) 03:59:58)
- 5 (2015-03-08 (日) 18:52:15)
- 6 (2016-01-16 (土) 01:49:54)
- 7 (2016-01-28 (木) 13:06:03)
- 8 (2017-07-04 (火) 14:03:27)
- 9 (2018-05-02 (水) 14:50:47)
- 10 (2020-04-24 (金) 18:36:37)
- 11 (2020-12-14 (月) 02:37:20)
- 12 (2023-05-19 (金) 17:11:42)
- category: swing folder: LineSplittingLabel title: Fontのアウトラインを取得して文字列の内部を修飾する tags: [Font, Shape, Graphics, TextLayout, GlyphVector, JComponent] author: aterai pubdate: 2011-09-26T17:16:34+09:00 description: クリップを設定することで描画範囲を制限し、文字列の内部を異なる色で修飾します。 image:
概要
クリップを設定することで描画範囲を制限し、文字列の内部を異なる色で修飾します。
Screenshot
Advertisement
サンプルコード
class TricoloreLabel extends JComponent {
private final GlyphVector gv;
public TricoloreLabel(String str) {
super();
Font font = new Font(Font.SERIF, Font.PLAIN, 64);
FontRenderContext frc = new FontRenderContext(null, true, true);
gv = font.createGlyphVector(frc, str);
}
@Override protected void paintComponent(Graphics g) {
super.paintComponent(g);
int w = getWidth();
int h = getHeight();
g.setColor(Color.WHITE);
g.fillRect(0, 0, w, h);
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
Rectangle2D b = gv.getVisualBounds();
Point2D p = new Point2D.Double(
b.getX() + b.getWidth() / 2d, b.getY() + b.getHeight() / 2d);
AffineTransform toCenterAT = AffineTransform.getTranslateInstance(
w / 2d - p.getX(), h / 2d - p.getY());
double d = b.getHeight() / 3;
Rectangle2D clip = new Rectangle2D.Double(
b.getX(), b.getY(), b.getWidth(), b.getHeight());
Rectangle2D clip1 = new Rectangle2D.Double(
b.getX(), b.getY(), b.getWidth(), d);
Rectangle2D clip2 = new Rectangle2D.Double(
b.getX(), b.getY() + 2 * d, b.getWidth(), d);
Shape s = toCenterAT.createTransformedShape(gv.getOutline());
g2.setClip(toCenterAT.createTransformedShape(clip1));
g2.setPaint(Color.BLUE);
g2.fill(s);
g2.setClip(toCenterAT.createTransformedShape(clip2));
g2.setPaint(Color.RED);
g2.fill(s);
g2.setClip(toCenterAT.createTransformedShape(clip));
g2.setPaint(Color.BLACK);
g2.draw(s);
g2.dispose();
}
}
View in GitHub: Java, Kotlin解説
- 左
TextLayout
からアウトラインを取得し、上下にクリッピング領域を設定して色分け
- 右
GlyphVector
からアウトラインを取得し、上中下にクリッピング領域を設定して色分け
参考リンク
Graphics#setClip(Shape) (Java Platform SE 8)