如何让JTextPane显示省略号以指示文本溢出?

时间:2011-07-07 13:35:27

标签: java swing jtable jtextpane renderer

我使用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;
    }

3 个答案:

答案 0 :(得分:4)

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

我也喜欢带垃圾桶的想法。 (1)

答案 1 :(得分:4)

如果滚动条是可接受的替代方案,但空间非常宝贵,您可以指定JComponent.sizeVariant,如Resizing a ComponentUsing Client Properties中所述。

答案 2 :(得分:0)

我是通过覆盖paint()getToolTipText()方法完成的,如果它太长则将其放在工具提示中:

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