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

标签 java swing jtable tablecellrenderer jtableheader

如果你想添加自定义渲染器,通常,你要么扩展一些 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, Part 2 - How To Create A Custom Renderer

如果我返回 component,它呈现的就像我没有覆盖任何东西一样。也就是说,我得到的标题带有我用所选的 L&F 背景和风格以及所有内容编写的标签。 但是,当然,之后没有办法渲染我的东西。

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

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

还有其他方法吗?我考虑过尝试将原生样式的 JPanel 放入其中,然后将自定义(透明背景)组件作为其子组件,尽管我不确定如何去做,而且我'我不太确定无论如何我都会得到原生的 L&F 表 header 背景。事实上,我非常怀疑我能否获得 native 标题样式,只是 native JPanel 样式。

基本上,我需要一个自定义表格标题(实际上还需要单独的单元格),但我想避免与原生 L&F 混淆太多。

谢谢!

最佳答案

您可以查看 SelectAllHeaderTestupdateUI() 中采用的方法,以及已接受答案中的有用警告。

附录:作为解释,请注意 header 的外观属于主机平台相应 UI 委托(delegate)的支持,通常来自 TableHeaderUI。 .您可能希望将更改限制在 UIManager Defaults常见于流行的外观和感觉实现。另外,不要覆盖 paint()。我会避免重写 paintComponent();并且,如有必要,覆盖 paintIcon(),如 TableSorter 中所示.

关于Java:覆盖表格单元格渲染器,但使用默认背景和属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7465881/

相关文章:

java - JTable + 排序特定字段

java - Endeca 5 和 Endeca 6 之间的 ENEQuery 对象有什么区别吗?

java - 如何构建Java代码以供重用?

java - Jersey2 @BeanParam 比替代方案慢得多

java - JMenuBar 未出现在 JFrame 中

java - 无法从 JFrame 正确创建 JPanel

java - JButton 和 actionPerformed 方法是否可能位于不同的文件中?

java - 两个fragment之间如何通信

Java 简单日期格式

java - JTable 行标题文本