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最大120px?

我可以使用metrics.stringWidth(myString),但我没有得到我必须剪断字符串的位置。

预期结果可能是:

A longer string that exc...
A shorter string.
Another long string, but OK
4

3 回答 3

1

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

验证新字符串没有剪断 - 如果有,请根据需要进行一些调整。毕竟,如果您有 WWWWWWWiiiiii,您可能需要对其进行调整。但总而言之,这种方法会很快。

于 2010-05-17T14:47:23.363 回答
0

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

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

于 2010-05-17T13:41:16.503 回答
-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;
}
于 2012-11-20T13:30:30.673 回答