Как заставить JTextPane отображать многоточие, чтобы сигнализировать о переполнении текста?

Я использую 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;
    }

person user443854    schedule 07.07.2011    source источник
comment
Действительно, почему бы и нет? Спасибо, позвольте мне попробовать и посмотреть, приемлемо ли это. У меня нет возможности увеличить высоту ячейки, поэтому это будет миниатюрная полоса прокрутки. Может сработает, дай попробую.   -  person user443854    schedule 07.07.2011
comment
Полоса прокрутки у меня не работала из-за специфики моего графического интерфейса. Чтобы сделать полосу прокрутки прокручиваемой, мне пришлось бы предоставить для нее редактор. Но у меня уже есть редактор, у которого совсем другое поведение. я не хотел о   -  person user443854    schedule 08.07.2011


Ответы (3)


Вы можете использовать этот http://java-sl.com/tip_text_height_measuring.html для измерения контента для фиксированная ширина. Если для этого требуется больше места, чем доступно, просто нарисуйте что-нибудь поверх JTextPane.

Мне тоже нравится идея трэшбога со свитком. (+1)

person StanislavL    schedule 07.07.2011
comment
+1 за точность. Возможно, стоит добавить какие-то средства отображения пропущенного текста, возможно, в диалоговом окне? - person trashgod; 07.07.2011
comment
Заманчиво вернуть JLabel из рендерера, но тогда мы теряем возможности форматированного текста. Не хорошо. - person user443854; 07.07.2011
comment
В конце концов, это сработало. Что-то вроде того, что вы предложили. Большое спасибо! - person user443854; 08.07.2011

Если полоса прокрутки является приемлемой альтернативой, но пространство в большом почете, вы можете указать JComponent.sizeVariant, как описано в Изменение размера компонента и Использование свойств клиента.

person trashgod    schedule 07.07.2011

Я сделал это, просто переопределив методы 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;
}
person codemonkey    schedule 26.07.2012