Java:覆盖表单元格呈现程序,但使用默认背景和属性

Java:覆盖表单元格呈现程序,但使用默认背景和属性,java,swing,jtable,tablecellrenderer,jtableheader,Java,Swing,Jtable,Tablecellrenderer,Jtableheader,如果您想添加自定义渲染器,通常,您可以扩展一些JComponent(如JLabel),并实现tablecelrenderer,或者扩展defaulttabellrenderer。但是,在任何一种情况下,我发现单元格样式都被完全覆盖 我真正想要的是能够绘制默认的L&F背景,然后使用其他L&F默认值(如前景色和字体)在其上绘制 所以,我试着这么做。首先,课堂: public class IntervalHeaderRenderer extends JLabel implements TableCel

如果您想添加自定义渲染器,通常,您可以扩展一些
JComponent
(如
JLabel
),并实现
tablecelrenderer
,或者扩展
defaulttabellrenderer
。但是,在任何一种情况下,我发现单元格样式都被完全覆盖

我真正想要的是能够绘制默认的L&F背景,然后使用其他L&F默认值(如前景色和字体)在其上绘制

所以,我试着这么做。首先,课堂:

public class IntervalHeaderRenderer extends JLabel implements TableCellRenderer {

    private TableCellRenderer delegate;
    private Component component;

    public IntervalHeaderRenderer(TableCellRenderer defaultRenderer)
    {
        this.delegate = defaultRenderer;
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
                           boolean isSelected, boolean hasFocus, int row, int column)
    {
        component = delegate.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        // Maybe override some settings.  
        // You could make the label bold, for instance.

        return component;
        // return this;
    }

    @Override
    public void paint(Graphics g) {
        // What I really want to do is paint the original component
        component.paint(g);
        // And then draw on top of it.
    }
}
然后我覆盖单元格(标题)渲染器,如下所示:

TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer();
table.getColumnModel().getColumn(1).setHeaderRenderer(new IntervalHeaderRenderer(renderer));
我基本上只是按照这里的建议:

如果我返回
组件
,它将呈现为我没有覆盖任何内容。也就是说,我得到了标题和标签,我已经与选择的L&F背景和风格和一切编程但是,当然,之后没有办法渲染我的东西

另一方面,如果我返回
this
,那么我将一无所获。Mac native L&F给了我白色背景,而Nimbus给了我其他颜色的纯色

我显然错过了什么。
组件
上是否有其他方法需要覆盖并转发到原始方法?如果不覆盖
绘制
,如何绘制默认组件?(我也尝试过重写
paintComponent
。没有区别。)

还有别的办法吗?我曾想过尝试将一个本机样式的
JPanel
放在其中,然后将一个自定义(透明背景)组件作为其子组件,尽管我不确定该如何操作,而且我也不确定我是否会得到本机L&F表标题背景。事实上,我非常怀疑我会得到原生的头样式,仅仅是原生的
JPanel
样式

基本上,我需要一个自定义的表头(实际上也需要单独的单元格),但我希望避免与本机L&F混淆太多


谢谢

您可以查看中的
updateUI()
中采用的方法,以及公认答案中的有用注意事项


附录:作为解释,请注意标题的外观属于主机平台相应的UI委托的保护范围,通常派生自。您可能希望将更改限制在常见到流行的外观实现上。另外,不要覆盖
paint()
。我会避免重写
paintComponent()
;并且,如有必要,覆盖
paintIcon()
,如所示。

检查
DefaultTableCellRenderer
源代码,您将看到默认行为如何读取默认颜色,如:

        fg = DefaultLookup.getColor(this, ui, "Table.dropCellForeground");
        bg = DefaultLookup.getColor(this, ui, "Table.dropCellBackground");

谢谢你的帮助!我快到了。根据你的建议,我现在有了正确的背景。但是,您说不要覆盖paint()。为了在背景上绘制自定义小部件,我需要覆盖什么?谢谢。实际上,使用这种方法,它看起来适合Mac native,但不适合Nimbus。“Swing程序应该重写
paintComponent()
,而不是重写
paint()
”。请提供一份说明修改方法的表格。绘制默认L&F背景,然后使用其他L&F默认值(如前景色和字体)在其上绘制。-如果所有内容都是默认设置,只需使用。。默认值;-)因为这不可能是您的意图:您希望与默认值有什么不同?