Swing/GlyphVector のバックアップ(No.10)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/GlyphVector へ行く。
- 1 (2005-12-08 (木) 15:47:30)
- 2 (2006-02-27 (月) 15:58:14)
- 3 (2006-06-12 (月) 18:15:43)
- 4 (2006-06-22 (木) 17:31:50)
- 5 (2007-03-26 (月) 00:33:06)
- 6 (2007-04-07 (土) 15:37:38)
- 7 (2007-08-01 (水) 17:02:00)
- 8 (2007-08-16 (木) 17:24:50)
- 9 (2009-01-05 (月) 17:13:20)
- 10 (2009-08-07 (金) 20:19:03)
- 11 (2010-12-15 (水) 11:27:38)
- 12 (2011-03-18 (金) 19:10:33)
- 13 (2012-06-26 (火) 20:39:46)
- 14 (2013-01-01 (火) 20:54:53)
- 15 (2013-01-01 (火) 22:38:47)
- 16 (2013-02-20 (水) 15:35:30)
- 17 (2013-04-05 (金) 17:53:21)
- 18 (2013-08-20 (火) 14:38:05)
- 19 (2013-10-09 (水) 18:51:48)
- 20 (2013-11-12 (火) 16:50:09)
- 21 (2014-11-22 (土) 03:59:58)
- 22 (2014-11-25 (火) 03:03:31)
- 23 (2014-12-14 (日) 14:33:10)
- 24 (2015-03-18 (水) 18:48:56)
- 25 (2016-05-26 (木) 14:55:17)
- 26 (2016-06-02 (木) 12:27:14)
- 27 (2016-09-14 (水) 18:09:51)
- 28 (2017-03-29 (水) 16:14:28)
- 29 (2017-05-01 (月) 21:40:57)
- 30 (2018-04-25 (水) 18:56:12)
- 31 (2020-04-19 (日) 16:42:09)
- 32 (2021-10-21 (木) 19:06:59)
- 33 (2022-08-20 (土) 22:15:25)
TITLE:JLabelの文字列を折り返し
Posted by terai at 2004-03-02
JLabelの文字列を折り返し
GlyphVectorを使って、ラベルの文字列を折り返して表示します。
- &jnlp;
- &jar;
- &zip;
#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();
}
});
解説
- 上:JLabel
- 中:GlyphVector
- ラベルのサイズが変更されるたびに GlyphVector を更新することで、文字列の折り返しを行っています。
- 下:JTextArea
- JLabelのFont、背景色を設定した編集不可のJTextAreaをsetLineWrap(true);として、文字列の折り返しを行っています。
ラベルの幅ではなく、任意の場所で文字列を改行したい場合は、以下のようにhtmlタグを利用したり、編集不可にしたJTextPane、JTextAreaなどを使用します(参考:JTextPane、JLabelなどで複数行を表示)。
label.setText("<html>文字列を適当なところで<br>折り返す。");
参考リンク
コメント
- JTextArea#setLineWrap(true);を使う方法を追加、スクリーンショットの更新。 -- terai