我正在使用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/

10-08 23:38