Как заставить JTextPane отображать многоточие, чтобы сигнализировать о переполнении текста? - PullRequest
2 голосов
/ 07 июля 2011

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

4 голосов
/ 07 июля 2011

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

4 голосов
/ 07 июля 2011

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

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

0 голосов
/ 26 июля 2012

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