Java:覆盖表单元格渲染器,但使用默认的背景和属性



如果您想添加自定义渲染器,通常情况下,您要么扩展一些JComponent(如JLabel(并实现TableCellRenderer,要么扩展DefaultTableCellRenderer。但是,无论在哪种情况下,我都会发现单元格样式被完全覆盖。

我真正想要的是能够绘制默认的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));

我基本上只是遵循这里的建议:TableCellRenderer,第2部分-如何创建自定义渲染器

如果我返回component,它将显示为我没有覆盖任何内容。也就是说,我得到了带有我用所选L&背景和风格等等但是当然,之后没有办法呈现我的东西。

另一方面,如果我返回this,那么我什么也得不到。Mac原生L&F给了我一个白色的背景,而Nimbus给了我一些其他颜色的固体。

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

有别的办法吗?我曾想过尝试在其中放入一个原生风格的JPanel,然后将一个自定义(透明背景(组件作为它的子组件,尽管我不确定如何进行,也不确定我是否真的能得到原生L&不管怎样,F表的标题背景。事实上,我非常怀疑我会得到原生的头样式,只是原生的JPanel样式。

基本上,我需要一个自定义的表头(实际上,还需要单独的单元格(,但我想避免过多地干扰原生L&F.

谢谢!

您可以在SelectAllHeaderTest中查看updateUI()中采用的方法,以及已接受答案中有用的注意事项。

附录:作为解释,请注意标头的外观属于主机平台的相应UI委托的保护范围,通常源自TableHeaderUI。您可能希望将更改限制在流行的Look&感受实现。此外,不要覆盖paint()。我会避免覆盖paintComponent();如有必要,覆盖paintIcon(),如TableSorter所示。

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

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

相关内容

  • 没有找到相关文章

最新更新