我喜欢让“瘦”字符算作半个字符的想法。简单而良好的近似。
然而,大多数省略的主要问题是(imho)他们在中间砍了字。这是一个考虑单词边界的解决方案(但不涉及像素数学和Swing-API)。
private final static String NON_THIN = "[^iIl1\.,']";private static int textWidth(String str) { return (int) (str.length() - str.replaceAll(NON_THIN, "").length() / 2);}public static String ellipsize(String text, int max) { if (textWidth(text) <= max) return text; // Start by chopping off at the word before max // This is an over-approximation due to thin-characters... int end = text.lastIndexOf(' ', max - 3); // Just one long word. Chop it off. if (end == -1) return text.substring(0, max-3) + "..."; // Step forward as long as textWidth allows. int newEnd = end; do { end = newEnd; newEnd = text.indexOf(' ', end + 1); // No more spaces. if (newEnd == -1) newEnd = text.length(); } while (textWidth(text.substring(0, newEnd) + "...") < max); return text.substring(0, end) + "...";}


