如何在Java2D中剪切字符串并在末尾添加省略号?

3

我正在尝试在Java Swing应用程序中打印发票。我通过扩展Printable并实现方法public int print(Graphics g, PageFormat pf, int page)来完成这个功能。

我想要将字符串绘制在列中,当字符串过长时,我想要对其进行裁剪,并以"..."结束。如何测量字符串并在正确位置进行裁剪?

我的一些代码:

Font headline = new Font("Times New Roman", Font.BOLD, 14);
g2d.setFont(headline);
FontMetrics metrics = g2d.getFontMetrics(headline);
g2d.drawString(myString, 0, 20);

如何将myString限制在最大120像素内?

我可以使用metrics.stringWidth(myString),但我不知道在哪里截断字符串。

期望的结果可能是:

A longer string that exc...
A shorter string.
Another long string, but OK
3个回答

1

通过将stringWidth除以字符数来获得每个字符的平均宽度,您可以得到一个很好的估计值。然后,您可以取剪辑距离以查看可以容纳多少个字符。从开头到几乎该距离(减去两个或三个...)的子字符串,并在末尾放置...。

验证新字符串是否不会被剪辑 - 如果是,则根据需要进行一些调整。毕竟,如果您有WWWWWWWWiiiiii,您可能需要进行调整。但总体而言,这种方法将非常快速。


0

一旦你知道字符串需要被剪裁,你可以使用二分查找来确定可以显示多少个字符,包括省略号后缀。

这类似于如果你尝试N-1个字符,N-2个字符,N-3个字符等等,直到找到一个适合允许空间的子字符串+“...”。但是,与其线性迭代,不如使用二分查找来找到更少尝试次数的字符数。


-1
String cutString(String originalString, int placeholderWidth, FontMetrics fontMetrics) {
    int stringWidth = fontMetrics.stringWidth(originalString);
    String resultString = originalString;

    while (stringWidth >= placeholderWidth) {
        resultString = resultString.substring(0, resultString.length() - 4);
        resultString = resultString.concat("...");
        stringWidth = fontMetrics.stringWidth(resultString);
    }

    return resultString;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接