+ \r
+ /**\r
+ * \r
+ */\r
+ private void drawString(Graphics2D g2, WrappedGlyphVector wgv, float x, float y) {\r
+ g2.drawGlyphVector(wgv.getGv(), x, y);\r
+ \r
+ if ( wgv.getGv().getFont().getAttributes().get(TextAttribute.UNDERLINE) != null ) {\r
+ for ( Rectangle r : wgv.getLinePositions() ) {\r
+ g2.drawLine((int)x+r.x, (int)y+r.y+1, (int)x+r.x+r.width-1, (int)y+r.y+1);\r
+ }\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * 参考:てんぷらメモ/JTableのセル幅で文字列を折り返し ( http://terai.xrea.jp/Swing/TableCellRenderer.html )\r
+ * @param str 描画する文字列\r
+ * @param width 描画領域の幅\r
+ * @param height 描画領域の高さ \r
+ * @param xstart 1行目の描画開始位置\r
+ * @param lineCountMax 最大描画行数\r
+ * @param font 描画フォント\r
+ * @param lineHeight 1行あたりの高さ\r
+ * @param frc FontRenderContext\r
+ * @return\r
+ */\r
+ private WrappedGlyphVector getWrappedGlyphVector(String str, float width, float xstart, Font font, float lineHeight, FontRenderContext frc) {\r
+ Point2D gmPos = new Point2D.Double(0.0d, 0.0d);\r
+ GlyphVector gv = font.createGlyphVector(frc, str);\r
+ WrappedGlyphVector wgv = new WrappedGlyphVector(gv);\r
+ float xpos = xstart;\r
+ float ypos = 0.0F;\r
+ float advance = 0.0F;\r
+ GlyphMetrics gm;\r
+ for( int i=0; i <= gv.getNumGlyphs(); i++ ) {\r
+ if ( i == gv.getNumGlyphs() ) {\r
+ int x = (int) ((ypos == 0.0F) ? xstart : 0.0F);\r
+ int y = (int) ypos;\r
+ int w = (int) (xpos - x);\r
+ wgv.addLinePosition(new Rectangle(x, y, w, 1));\r
+ break;\r
+ }\r
+ gm = gv.getGlyphMetrics(i);\r
+ advance = gm.getAdvance();\r
+ if( xpos < width && width <= xpos+advance ) {\r
+ int x = (int) ((ypos == 0.0F) ? xstart : 0.0F);\r
+ int y = (int) ypos;\r
+ int w = (int) (xpos - x);\r
+ wgv.addLinePosition(new Rectangle(x, y, w, 1));\r
+ ypos += lineHeight;\r
+ xpos = 0.0f;\r
+ }\r
+ gmPos.setLocation(xpos, ypos);\r
+ gv.setGlyphPosition(i, gmPos);\r
+ xpos = xpos + advance;\r
+ \r
+ wgv.setLastX(xpos);\r
+ wgv.setLastY(ypos);\r
+ }\r
+ return wgv;\r
+ }\r
+ \r
+ private class WrappedGlyphVector {\r
+ \r
+ public WrappedGlyphVector(GlyphVector gv) {\r
+ super();\r
+ this.gv = gv;\r
+ }\r
+ \r
+ private GlyphVector gv;\r
+ \r
+ public GlyphVector getGv() { return gv; }\r
+ \r
+ private float lastx;\r
+ private float lasty;\r
+ \r
+ public void setLastX(float x) { lastx = x; }\r
+ public float getLastX() { return lastx; }\r
+ public void setLastY(float y) { lasty = y; }\r
+ public float getLastY() { return lasty; }\r
+ \r
+ private ArrayList<Rectangle> linePositions = new ArrayList<Rectangle>();\r
+ public ArrayList<Rectangle> getLinePositions() { return linePositions; }\r
+ public void addLinePosition(Rectangle r) { linePositions.add(r); }\r
+ }\r