Пользовательский рендер заголовка в 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, был установлен как средство визуализации по умолчанию