代码之家  ›  专栏  ›  技术社区  ›  akarnokd

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

  •  0
  • akarnokd  · 技术社区  · 16 年前

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

    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);
    }
    

    有没有更好的方法来确定我应该使用多少个字符 drawString() 在切换到。。。(u2026)角色?

    2 回复  |  直到 16 年前
        1
  •  0
  •   Ian Kemp    16 年前

    我想不出实现所需效果的其他方法,但您应该能够将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);
    }
    
        2
  •  0
  •   camickr    16 年前

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