Как вставить JEditorPane в ячейку JTable?

Я хочу поместить JEditorPane в ячейку JTable. Я написал это:

jTabel1.setDefaultRenderer(String.class, new StringEditorPane());
.........
class StringEditorPane extends JEditorPane
    implements TableCellRenderer {

public StringEditorPane() {
    setContentType("text/html");
}



 public Component getTableCellRendererComponent(
            JTable table, Object styledString,
            boolean isSelected, boolean hasFocus,
            int row, int column) {
        if (isSelected) {
            String styledText = (String) styledString;
            setText(styledText);
            setBackground(getSelectionColor());
            return this;
        } else {
            String styledText = (String) styledString;
            setText(styledText);
            setBackground(Color.white);
            return this;
        }
    }
}

Я могу скомпилировать его, и он покажет JEditorPane, но он также выдает исключение, и я не знаю, почему.

Исключение:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at javax.swing.text.DefaultStyledDocument.getParagraphElement(DefaultStyledDocument.java:445)
    at javax.swing.text.StyledEditorKit$AttributeTracker.updateInputAttributes(StyledEditorKit.java:223)
    at javax.swing.text.StyledEditorKit$AttributeTracker.caretUpdate(StyledEditorKit.java:258)
    at javax.swing.text.JTextComponent.fireCaretUpdate(JTextComponent.java:391)
    at javax.swing.text.JTextComponent$MutableCaretEvent.fire(JTextComponent.java:4387)
    at javax.swing.text.JTextComponent$MutableCaretEvent.stateChanged(JTextComponent.java:4409)
    at javax.swing.text.DefaultCaret.fireStateChanged(DefaultCaret.java:782)
    at javax.swing.text.DefaultCaret.changeCaretPosition(DefaultCaret.java:1257)
    at javax.swing.text.DefaultCaret.handleSetDot(DefaultCaret.java:1153)
    at javax.swing.text.DefaultCaret.setDot(DefaultCaret.java:1134)
    at javax.swing.text.DefaultCaret$Handler.removeUpdate(DefaultCaret.java:1777)
    at javax.swing.text.AbstractDocument.fireRemoveUpdate(AbstractDocument.java:243)
    at javax.swing.text.AbstractDocument.handleRemove(AbstractDocument.java:608)
    at javax.swing.text.AbstractDocument.remove(AbstractDocument.java:576)
    at javax.swing.JEditorPane.setText(JEditorPane.java:1493)
    at myProject.StringEditorPane.getTableCellRendererComponent(MainWindow.java:136)
    at javax.swing.JTable.prepareRenderer(JTable.java:5720)
........

И строка 136 из MainWindow.java:

setText(styledText);

из функции getTableCellRendererComponent.


person latata    schedule 28.02.2011    source источник


Ответы (3)


Кажется, сбой возникает из-за удаления старого контента. Попробуйте заменить документ новым экземпляром. Перед вызовом setText()

setDocument(getEditorKit().createDefaultDocument());
person StanislavL    schedule 01.03.2011

Похоже, вам нужно обработать значение null для вашей переменной styledText.

person jzd    schedule 28.02.2011
comment
Ооо... это было так просто. Не знаю, почему я не замечал этого раньше. :/ Спасибо - person latata; 28.02.2011
comment
Извините, но это неправильно. Я изменил эту строку на: setText(xxxx); и то же самое происходит - person latata; 01.03.2011

Не уверен, зачем вам нужен пользовательский рендерер. Средство визуализации по умолчанию для класса String — это JLabel, а JLabels поддерживает HTML.

person camickr    schedule 28.02.2011