TITLE:JLabelの文字列を折り返し

JLabelの文字列を折り返し

編集者:Terai Atsuhiro
作成日:2004-03-02
更新日:2021-10-21 (木) 19:06:59

概要

GlyphVectorを使って、ラベルの文字列を折り返して表示します。

#screenshot

サンプルコード

 private GlyphVector getWrappedGlyphVector(String str,
                                           float wrapping,
                                           Font font,
                                           FontRenderContext frc) {
   Point2D gmPos    = new Point2D.Double(0.0d, 0.0d);
   GlyphVector gv   = font.createGlyphVector(frc, str);
   float lineheight = (float) (gv.getLogicalBounds().getHeight());
   float xpos       = 0.0f;
   float advance    = 0.0f;
   int   lineCount  = 0;
   GlyphMetrics gm;
   for(int i=0;i<gv.getNumGlyphs();i++) {
     gm = gv.getGlyphMetrics(i);
     advance = gm.getAdvance();
     if(xpos<wrapping && wrapping<=xpos+advance) {
       lineCount++;
       xpos = 0.0f;
     }
     gmPos.setLocation(xpos, lineheight*lineCount);
     gv.setGlyphPosition(i, gmPos);
     xpos = xpos + advance;
   }
   return gv;
 }

 lbl2 = new JLabel() {
   protected void paintComponent(Graphics g) {
     super.paintComponent(g);
     Graphics2D g2 = (Graphics2D)g;
     if(flg) {
       int wrap = lbl2.getWidth()
                  -lbl2.getInsets().left
                  -lbl2.getInsets().right;
       FontRenderContext frc = g2.getFontRenderContext();
       gvtext = getWrappedGlyphVector(str, wrap, lbl2.getFont(), frc);
       flg    = false;
     }
     g2.setPaint(Color.RED);
     g2.drawGlyphVector(gvtext,
                        lbl2.getInsets().left,
                        lbl2.getInsets().top+lbl2.getFont().getSize());
   }
 };
 lbl2.addComponentListener(new ComponentAdapter() {
   public void componentResized(ComponentEvent e) {
     flg = true;
     lbl2.repaint();
   }
 });
  • &jnlp;
  • &jar;
  • &zip;

解説

上記のサンプルでは、上が普通のラベルで、下はラベルの幅(余白に注意)で文字列を折り返すようになっています。折り返しは、ラベルのサイズが変更されるたびに、GlyphVectorを更新することで行っています。

ラベルの幅ではなく、任意の場所で文字列を改行したい場合は、以下のようにhtmlタグを使用したり、編集不可にしたJTextPane、JTextAreaなどがよく使われるようです(参考:JTextPane、JLabelなどで複数行を表示)。

label.setText("<html>文字列を適当なところで<br>折り返す。");

参考リンク

コメント