2

我使用 JTextPane 作为表格单元格渲染器来显示富文本。当文本太长而无法放入单元格时,它会被截断。我想模仿 JLabel 行为,即显示省略号 (...) 以提醒用户部分文本不可见。有没有人这样做过?


在 StanislavL 的帮助下,我最终采用了解决方案。该算法的工作原理是在 末尾一次切掉一个字符StyledDocument,附加“...”并将生成的首选宽度与表格单元格宽度进行比较。这是低效的,特别是在字符串很长的情况下,但在我的情况下不是问题。可以优化。以下内容进入您的渲染器getTableCellRendererComponent

    m_dummyTextPane.setDocument(doc);
    m_dummyTextPane.setSize(Short.MAX_VALUE, table.getRowHeight());        
    int width = m_dummyTextPane.getPreferredSize().width;
    int start = doc.getLength() - 1;
    while(width >= table.getColumnModel().getColumn(col).getWidth() && start>0) {  
        try {
            doc.remove(Math.min(start, doc.getLength()), 
                    doc.getLength() - Math.min(start, doc.getLength()));
            doc.insertString(start, "...", null);
        } catch (BadLocationException e) {
            e.printStackTrace();
            break;
        }
        start--;
        width = m_dummyTextPane.getPreferredSize().width;
    }
4

3 回答 3

4

您可以使用此http://java-sl.com/tip_text_height_measuring.html来测量固定宽度的内容。如果它需要比可用空间更多的空间,只需在 JTextPane 上绘制一些东西。

我也喜欢垃圾神用滚动条的想法。(+1)

于 2011-07-07T13:53:31.700 回答
4

如果滚动条是可接受的替代方案,但空间非常宝贵,您可以指定 a JComponent.sizeVariant,如调整组件大小使用客户端属性中所述。

于 2011-07-07T13:53:40.227 回答
0

我只是通过覆盖paint()andgetToolTipText()方法来做到这一点,如果它太长的话,把它放在工具提示中:

public void paint(Graphics g)
{
     frc=((Graphics2D)g).getFontRenderContext();
     super.paint(g);
}

public String getToolTipText(MouseEvent e)
{
    String tip=null;
    java.awt.Point p=e.getPoint();
    int colnum=columnModel.getColumnIndexAtX(p.x);
    int rowIndex=rowAtPoint(p);
    String field=(String)getModel().getValueAt(rowIndex, colnum);

    if (getColumnModel().getColumn(colnum).getWidth()< getFont().getStringBounds(field,frc).getWidth())
    {
        int i=0;
        StringBuffer buf=new StringBuffer("<html>");
        while (i<field.length())
        {
            buf.append(field.substring(i, Math.min(field.length(),i+100)));
            buf.append("<br>");
            i+=100;
        }
        tip=buf.toString();
    }
    return tip;
}
于 2012-07-26T13:43:48.290 回答