我使用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;
}
答案 0 :(得分:4)
您可以使用此http://java-sl.com/tip_text_height_measuring.html来衡量固定宽度的内容。如果它需要比可用空间更多的空间,只需在JTextPane上绘制一些东西。
我也喜欢带垃圾桶的想法。 (1)
答案 1 :(得分:4)
如果滚动条是可接受的替代方案,但空间非常宝贵,您可以指定JComponent.sizeVariant
,如Resizing a Component和Using 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;
}