テキストをボックスにレンダリングし、余分なものを3つのドットに置き換える方法
質問
カスタムテーブルセルレンダラーを使用してテキストをレンダリングし、現在のセル幅を超える場合に描画されるテキストをトリムし、「このテキストは長すぎます...」に切り替えます。終わりの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);
}
所属していません StackOverflow