【问题标题】:Custom header renderer in JXTable?JXTable 中的自定义标题渲染器?
【发布时间】:2014-12-16 01:51:14
【问题描述】:

我使用JTable#setDefaultRenderer 在 Swing 中设置自定义渲染。

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

即渲染器功能已移至提供者的。

现在如何处理标题?

我在 Swing 中做的

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

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

【问题讨论】:

    标签: java swing jtable swingx jxtable


    【解决方案1】:

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

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

    可以DefaultTableRenderer,我们可以利用ComponentProvider<?>来委派基于CellContext的渲染器组件创建,如@987654322所述@。但它也可以是 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 的对象设置为默认渲染器。

    【讨论】: