TITLE:GlyphVectorで文字列を電光掲示板風にスクロール

GlyphVectorで文字列を電光掲示板風にスクロール

編集者:Terai Atsuhiro
作成日:2006-11-13
更新日:2021-02-16 (火) 17:06:46

概要

GlyphVectorを生成して、これを電光掲示板のようにスクロールさせます。

#screenshot

サンプルコード

 class ScrollingMessagePanel extends JComponent implements ActionListener {
   public final javax.swing.Timer animator;
   private final GlyphVector gv;
   private float xx, yy;
 
   public ScrollingMessagePanel() {
     super();
     animator = new javax.swing.Timer(10, this);
 
     String text = "asffdfaaAAASFDsfasdfsdfasdfasd";
     Font font = new Font("serif", Font.PLAIN, 100);
     FontRenderContext frc = new FontRenderContext(null,true,true);
 
     gv = font.createGlyphVector(frc, text);
     LineMetrics lm = font.getLineMetrics(text, frc);
     yy = lm.getAscent()/2f + (float)gv.getVisualBounds().getY();
   }
   public void paintComponent(Graphics g) {
     Graphics2D g2 = (Graphics2D)g;
     int cw = getWidth();
     int ch = getHeight();
     g2.setPaint(Color.WHITE);
     g2.draw(new Line2D.Float(0,ch/2f,cw,ch/2f));
 
     g2.setPaint(Color.BLACK);
     g2.drawGlyphVector(gv, cw-xx, ch/2f-yy);
     xx = (cw+gv.getVisualBounds().getWidth()-xx > 0) ? xx+2f : 0f;
   }
   public void actionPerformed(ActionEvent e) {
     repaint();
   }
 }
  • &jnlp;
  • &jar;
  • &zip;

解説

上記のサンプルでは、GlyphVectorやLineMetricsから、テキストのVisualBoundsやAscentを取得して、文字列を描画する位置などを計算しています。

以下のようにTextLayoutを使用する方法もあります。

 TextLayout tl = new TextLayout(text, font, frc);
 Rectangle2D b = tl.getBounds();
 yy = tl.getAscent()/2f + (float)b.getY();

コメント