3

JavaSwingアプリケーションで請求書を印刷しようとしています。私は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 を文字数で割って、1 文字あたりの平均幅を取得することで、適切な見積もりを得ることができます。次に、クリップの距離をとって、収まる文字数を確認します。部分文字列を最初からほぼその距離 (... の場合はマイナス 2 または 3) まで取り、最後に ... を配置します。

新しい弦がクリップしないことを確認します。クリップする場合は、必要に応じて調整します。結局のところ、WWWWWWWWWiiiiii がある場合は、おそらくそれを調整する必要があります。しかし、全体として、このアプローチは非常に高速です。

于 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 に答える