обрезка текстовых строк в jtextpane-рендерере ячеек jtable - PullRequest
3 голосов
/ 26 января 2010

Я использую JTextPane в качестве средства визуализации ячеек в моей таблице (поэтому я могу легко контролировать цвет, шрифт, размер и ссылки). проблема в том, что строки оборачиваются, когда ячейка становится слишком маленькой, чтобы содержать полный текст.

Я знаю количество ожидаемых строк текста заранее (или я могу просто посчитать), поэтому я соответствующим образом установил высоту строки.

как мне получить линии для обрезки (визуально! Т.е. в середине буквы) в конце ячейки?

спасибо, asaf :-)

больше информации: Я пробовал два решения, которые я нашел в сети. тот, который устанавливает мой собственный EditroKit , другое перечислено ниже и включает переопределение setSize ().
увы, никто не работал ...

вот мой рендерер (извиняюсь за испорченный отступ ...):

package textTable;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Insets;

import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextPane;
import javax.swing.table.TableCellRenderer;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

public class LogRenderer extends JPanel implements TableCellRenderer {
    static class NoWrapTextPane extends JTextPane {
        public NoWrapTextPane () {
            super();
        }
        @Override
        public boolean getScrollableTracksViewportWidth() {
            return false;
        }
        @Override
        public void setSize(Dimension d) {
            if(d.width < getParent().getSize().width) {
                d.width = getParent().getSize().width;
            }
            super.setSize(d);
        }
    }

    private JTextPane textPane = new NoWrapTextPane();//JTextPane();
    private StyledDocument doc = textPane.getStyledDocument();
    private SimpleAttributeSet attr = new SimpleAttributeSet();
    private FontMetrics fontMetrics;

    public LogRenderer() {
    textPane.setMargin(new Insets(0,0,0,0));

        fontMetrics = textPane.getFontMetrics(getFont());

        StyleConstants.setFontFamily(attr, "monospaced");//"Courier"

    setLayout(new BorderLayout());
    add(textPane,BorderLayout.CENTER);
}

public Component getTableCellRendererComponent(JTable table,
        Object value, boolean isSelected, boolean hasFocus, int row,
        int column) {
        String[] text;
        if (value != null && value instanceof String[]) {
            text = (String[]) value;
        } else {
            text = null;
        }
        try {
            doc.remove(0, doc.getLength());
            if (text != null) {
                int offset = 0;
                for (String line : text) {
                    doc.insertString(offset, line+"\n", attr);
                    offset += (line == null ? 0 : line.length()) +1;
                }
                int preferredHeight = fontMetrics.getHeight() *     text.length;
                if (preferredHeight != table.getRowHeight(row)) {
                    System.out.println("preferredHeight     "+preferredHeight+" = fontMetrics.getHeight() "+fontMetrics.getHeight()+" + text.length     "+text.length);
                    table.setRowHeight(row, preferredHeight);
                } 
            }
        } catch (BadLocationException e) {
            e.printStackTrace();
        }
//      textPane.setToolTipText("hi");
        return this;
    }   
}

1 Ответ

3 голосов
/ 26 января 2010

Использовать пользовательский рендерер . Расширение JLabel должно дать вам многоточие для обозначения усечения, но вы можете использовать JPanel и этот подход , чтобы обрезать результат.

Приложение: WrapEditorKit, который вы цитировали, работает хорошо и, кажется, делает то, что вы хотите. В вашем LogRenderer, я думаю, вы можете расширить JEditorPane и установить редактор в конструкторе. Например:

private static class LogRenderer
    extends JEditorPane implements TableCellRenderer {

    public LogRenderer() {
        this.setEditorKit(new WrapEditorKit());
    }

    public Component getListCellRendererComponent(
        JList list, Object value, int index,
        boolean isSelected, boolean cellHasFocus) {
        this.setText((String) value);
        return this;
    }

    @Override
    public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected,
        boolean hasFocus, int row, int column) {
        this.setText((String) value);
        return this;
    }
}
...