Java 如何将文本渲染到框中并用三个点替换多余的文本

Java 如何将文本渲染到框中并用三个点替换多余的文本,java,graphics,2d,Java,Graphics,2d,我使用自定义表格单元格渲染器渲染文本,如果绘制的文本超过当前单元格宽度,我希望对其进行修剪,切换到“此文本太长…”的表示形式,其中末尾的三个点永远不会离开边界框。我目前的算法如下: FontMetrics fm0 = g2.getFontMetrics(); int h = fm0.getHeight(); int ellw = fm0.stringWidth("\u2026"); int titleWidth = fm0.stringWidth(se.title); if (titleWid

我使用自定义表格单元格渲染器渲染文本,如果绘制的文本超过当前单元格宽度,我希望对其进行修剪,切换到“此文本太长…”的表示形式,其中末尾的三个点永远不会离开边界框。我目前的算法如下:

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);
}
FontMetrics fm0=g2.getFontMetrics();
inth=fm0.getHeight();
int ellw=fm0.stringWidth(“\u2026”);
int titleWidth=fm0.stringWidth(se.title);
如果(titleWidth>getWidth()){
对于(int i=se.title.length()-1;i>0;i--){
字符串tstr=se.title.substring(0,i);
int tstrw=fm0.stringWidth(tstr);
如果(tstrw+ellw

是否有更好的方法来确定在切换到。。。(u2026)字符?

我想不出其他方法来实现所需的效果,但您应该能够用一个调用替换2个drawString()调用。我已经有一段时间没有编写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);
}
FontMetrics=g2.getFontMetrics();
int fontHeight=metrics.getHeight();
int titleWidth=metrics.stringWidth(se.title);
如果(titleWidth>getWidth()){
字符串标题;
对于(int i=se.title.length()-1;i>0;i--){
titleString=se.title.substring(0,i)+“\u2026”;
titleWidth=metrics.stringWidth(titleString);
if(titleWidth
这是表的默认呈现器的默认行为,因此我不确定是否理解这样做的原因


但是我已经为左边的点创建了一个渲染器(“…文本太长”),它显示了一种更完整的方式来执行您想要的操作,因为它考虑了渲染器上可能的边界和渲染器的单元格间距。请查看。

谢谢。原因是第一行(标题)是以16磅的文本绘制的,第二行和第三行(一些细节)是作为单元格内的普通文本绘制的。LeftDotRenderer的主要区别在于,它计算每个字符的大小,而不是整个字符串宽度。我将测试它。