【问题标题】:How can I clip strings in Java2D and add ... in the end?如何在 Java2D 中剪辑字符串并在最后添加 ...?
【发布时间】:2010-05-17 13:22:19
【问题描述】:

我正在尝试在 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

【问题讨论】:

    标签: java string swing java-2d fontmetrics


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:
        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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-05
          • 1970-01-01
          • 1970-01-01
          • 2016-01-17
          • 2013-09-28
          相关资源
          最近更新 更多