TITLE:JLabelの文字揃え
#navi(../)
RIGHT:Posted by &author(aterai); at 2008-03-31
*JLabelの文字揃え [#sd977538]
JLabelで、左右中央両端などの文字揃えをテストします。

-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(http://lh4.ggpht.com/_9Z4BYR88imo/TQTOwQzSk-I/AAAAAAAAAc4/bD-z_hTSHB8/s800/JustifiedLabel.png)

**サンプルコード [#ad114894]
#code(link){{
JLabel l0 = new JLabel("打率");
JLabel l1 = new JLabel("打率", JLabel.RIGHT);
JLabel l2 = new JustifiedLabel("打率");
JLabel l3 = new JLabel("出塁率", JLabel.CENTER);
JLabel l4 = new JustifiedLabel("出塁率");
JLabel l5 = new JustifiedLabel("チーム出塁率");
}}
#code{{
class JustifiedLabel extends JLabel {
  private GlyphVector gvtext;
  private int prev_width = -1;
  public JustifiedLabel() {
    this(null);
  }
  public JustifiedLabel(String str) {
    super(str);
  }
  @Override protected void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    Insets i = getInsets();
    int w = getWidth() - i.left - i.right;
    if(w!=prev_width) {
      gvtext = getWrappedGlyphVector(
        getText(), w, getFont(), g2.getFontRenderContext());
      prev_width = w;
    }
    if(gvtext!=null) {
      g2.drawGlyphVector(gvtext,i.left,(getHeight()+getFont().getSize())/2);
    }else{
      super.paintComponent(g);
    }
  }
  private GlyphVector getWrappedGlyphVector(
      String str, float wrapping, Font font, FontRenderContext frc) {
    GlyphVector gv   = font.createGlyphVector(frc, str);
    float ga = 0.0f;
    for(int i=0;i<gv.getNumGlyphs();i++) {
      ga = ga + gv.getGlyphMetrics(i).getAdvance();
    }
    if(wrapping<ga) return null;

    float xx = (wrapping-ga) / (float)(gv.getNumGlyphs()-1);
    float xpos = 0.0f;
    Point2D gmPos = new Point2D.Double(0.0d, 0.0d);
    for(int i=0;i<gv.getNumGlyphs();i++) {
      GlyphMetrics gm = gv.getGlyphMetrics(i);
      gmPos.setLocation(xpos, 0);
      gv.setGlyphPosition(i, gmPos);
      xpos = xpos + gm.getAdvance() + xx;
    }
    return gv;
  }
}
}}

**解説 [#yb37fc4e]
JLabelの文字揃えは、デフォルトが左揃えで、その他に右揃え、中央揃えがあります。両端揃え(文字の均等割り付け)は存在しないようなので、上記のサンプルでは、JustifiedLabel((幅が足りない場合などは、通常のJLabelと同様にクリップ))を作成して使用しています。

//**参考リンク
**コメント [#b9352af4]
#comment