1

JTable#setDefaultRenderer用来设置在 Swing 中呈现的自定义。

据我了解,在SwingX这个方法中应该传递一个DefaultTableRenderer. 如果我需要一个非常自定义的绘图,我可以DefaultTableRenderer用我的自定义初始化ComponentProvider

即渲染器功能被移动到提供者的。

现在如何处理标题?

在 Swing 中我正在做

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

我应该在 SwingX 中做什么?再次使用DefaultTableRenderer

4

1 回答 1

1

据我了解,在 SwingX 中,这个方法应该传递一个实例DefaultTableRenderer

我不会说你应该/必须/必须使用DefaultTableRenderer,因为合同是继承自的JTable,它需要一个符合TableCellRenderer接口的对象。

可以是 a DefaultTableRenderer,我们可以利用ComponentProvider<?>基于 a 委托创建渲染器组件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在表头中使用。表头仍然是一个JTableHeadergetTableHeader()据我所知,该方法没有被覆盖),它仍然需要一个符合TableCellRenderer的对象设置为默认渲染器。

于 2014-12-16T22:00:27.990 回答