Пользовательский рендер заголовка в JXTable?

Я использовал JTable#setDefaultRenderer установить пользовательскую визуализацию в Swing.

Как я понял, в SwingX этот метод должен быть передан экземпляр DefaultTableRenderer, Если мне нужен очень нестандартный рисунок, я могу инициализировать DefaultTableRenderer с моим обычаем ComponentProvider

Т.е. функции рендерера были перенесены в провайдера.

Что теперь делать с заголовком?

В Swing я делал

getTableHeader().setDefaultRenderer(new MyHeaderRenderer());

Что мне делать в SwingX? использование DefaultTableRenderer снова?

1 ответ

Как я понял, в SwingX этому методу должен быть передан экземпляр DefaultTableRenderer

Я бы не сказал, что вы должны / должны / должны использовать DefaultTableRenderer потому что договор наследуется от JTable и для этого требуется объект, совместимый с интерфейсом TableCellRenderer.

Это может быть DefaultTableRenderer и мы можем воспользоваться ComponentProvider<?> делегировать создание компонента рендерера на основе CellContext, как объяснено здесь. Но это также может быть DefaultTableCellRenderer или любая реализация, которая соответствует интерфейсу ( например).

Это правда, что метод setDefaultRenderer(Class class, TableCellRenderer renderer) переопределяется, а не делает рендерер DefaultTableRenderer экземпляр, но для синхронизации строкового представления в случае, если средство визуализации является StringValue интерфейс совместимый объект. Мы можем видеть это в исходном коде:

public class JXTable extends JTable implements TableColumnModelExtListener {

    ...

    /**
     * {@inheritDoc} <p>
     * 
     * Overridden to synchronize the string representation. If the renderer is of type
     * StringValue a mapping it will be used as converter for the class type. If not, 
     * the mapping is reset to default.
     */
    @Override
    public void setDefaultRenderer(Class<?> columnClass,
            TableCellRenderer renderer) {
        super.setDefaultRenderer(columnClass, renderer);
        getStringValueRegistry().setStringValue(
                (renderer instanceof StringValue) ? (StringValue) renderer : null, 
                        columnClass);
    }

    ...
}

Сказав все это, я не думаю, что вы обязаны использовать DefaultTableRenderer в заголовке таблицы тоже. Заголовок таблицы остается JTableHeader (getTableHeader() насколько я знаю, метод не был переопределен), и он все еще требует, чтобы объект, совместимый с TableCellRenderer, был установлен как средство визуализации по умолчанию

Другие вопросы по тегам