テキストをボックスにレンダリングし、余分なものを3つのドットに置き換える方法

StackOverflow https://stackoverflow.com/questions/1216043

  •  06-07-2019
  •  | 
  •  

質問

カスタムテーブルセルレンダラーを使用してテキストをレンダリングし、現在のセル幅を超える場合に描画されるテキストをトリムし、「このテキストは長すぎます...」に切り替えます。終わりの3つのドットが境界ボックスを決して離れないような表現。私の現在のアルゴリズムは次のとおりです。

FontMetrics fm0 = g2.getFontMetrics(); 
int h = fm0.getHeight();
int ellw = fm0.stringWidth("\u2026");
int titleWidth = fm0.stringWidth(se.title);
if (titleWidth > getWidth()) {
    for (int i = se.title.length() - 1; i > 0; i--) {
        String tstr = se.title.substring(0, i);
        int tstrw = fm0.stringWidth(tstr);
        if (tstrw + ellw < getWidth()) {
            g2.drawString(tstr, 2, h);
            g2.drawString("\u2026", 2 + tstrw, h);
            break;
        }
    }
} else {
    g2.drawString(se.title, 2, h);
}

...(u2026)文字に切り替える前に、 drawString()の文字数を決定するより良い方法はありますか?

役に立ちましたか?

解決

これはテーブルのデフォルトのレンダラーのデフォルトの動作なので、これを行う理由がわかりません。

しかし、左側のドット用のレンダラーを作成しました(「...テキストが長すぎます」)。これは、レンダラー上の可能性のある境界線を考慮に入れるため、より完全な方法を示しています。レンダラーのセル間の間隔。 LeftDotRenderer をご覧ください。

他のヒント

目的の効果を達成する別の方法を考えることはできませんが、2つのdrawString()呼び出しを1つに置き換えることができるはずです。 Javaを書いてからしばらく経ちましたが、次のように動作するはずです。

ところで、変数名を変更してコードを読み取れるようにしました。 :p

FontMetrics metrics = g2.getFontMetrics(); 
int fontHeight = metrics.getHeight();
int titleWidth = metrics.stringWidth(se.title);

if (titleWidth > getWidth()) {
    String titleString;

    for (int i = se.title.length() - 1; i > 0; i --) {
        titleString = se.title.substring(0, i) + "\u2026";
        titleWidth = metrics.stringWidth(titleString);

        if (titleWidth < getWidth()) {
            g2.drawString(titleString, 2, fontHeight);

            break;
        }
    }
} else {
    g2.drawString(se.title, 2, fontHeight);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top