我正在使用JTable#setDefaultRenderer
设置在Swing中呈现的自定义。
据我了解,在SwingX
中应将此方法传递给DefaultTableRenderer
的实例。如果需要非常自定义的图形,可以使用自定义的DefaultTableRenderer
初始化ComponentProvider
即渲染器功能已移至提供程序。
现在如何处理标头?
在Swing中,我正在做
getTableHeader().setDefaultRenderer(new MyHeaderRenderer());
我应该在SwingX中做什么?再次使用
DefaultTableRenderer
吗? 最佳答案
据我了解,在SwingX中,此方法应传递DefaultTableRenderer
的实例
我不会说您应该/必须/必须使用DefaultTableRenderer
,因为合同是从JTable
继承的,并且它需要一个TableCellRenderer接口兼容对象。
它可以是DefaultTableRenderer
,我们可以利用ComponentProvider<?>
委托基于CellContext
的渲染器组件创建,如here所述。但它也可以是DefaultTableCellRenderer或符合接口(for example)的任何实现。
的确,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兼容对象设置为默认渲染器。关于java - JXTable中的自定义 header 渲染器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27496287/