/** * 文字超出限定長度自動換行 * * @param g 畫布 * @param font 字體樣式 * @param text 文字 * @param widthLength 最大長度 (多少長度后需要換行) * @param x 文字位置坐標 x * @param y 文字位置坐標 Y * @param yn 每次換行偏移多少pt */ private void drawString(Graphics2D g, Font font, String text, int widthLength, int x, int y, int yn) { FontMetrics fg = g.getFontMetrics(font); List<String> ls = new ArrayList<>(2); getListText(fg, text, widthLength, ls); for (int i = 0; i < ls.size(); i++) { if (i == 0) { g.drawString(ls.get(i), (int) UnitConv.mm2pt(x), (int) UnitConv.mm2pt(y)); } else { g.drawString(ls.get(i), (int) UnitConv.mm2pt(x), (int) UnitConv.mm2pt(y + yn)); } } } /** * 遞歸 切割字符串 * @param fg * @param text * @param widthLength * @param ls */ private void getListText(FontMetrics fg, String text, int widthLength, List<String> ls) { String ba = text; boolean b = true; int i = 1; while (b) { if (fg.stringWidth(text) > widthLength) { text = text.substring(0, text.length() - 1); i++; } else { b = false; } } if (i != 1) { ls.add(ba.substring(0, ba.length() - i)); getListText(fg, ba.substring(ba.length() - i), widthLength, ls); } else { ls.add(text); } }
畫圖中需要填寫文字,而文字大小不固定的時候就會超出畫布,顯示不了文字,就需要自動換行。