2

リッチテキストを表示するためのテーブルセルレンダラーとしてJTextPaneを使用しています。テキストが長すぎてセル内に収まらない場合、テキストは切り捨てられます。JLabelの動作を模倣したいと思います。つまり、テキストの一部が表示されないことをユーザーに警告するために省略記号(...)を表示します。誰かがこれを以前にやったことがありますか?


解決策私はStanislavLの助けを借りて採用することになりました。このアルゴリズムは、の終わりから一度に1文字ずつ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

スクロールバーが許容できる代替手段であるが、スペースが限られている場合は、コンポーネントのサイズ変更とクライアントプロパティの使用JComponent.sizeVariantで説明されているように、を指定できる場合があります。

于 2011-07-07T13:53:40.227 に答える
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;
}
于 2012-07-26T13:43:48.290 に答える