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

蒂莫西·米勒(Timothy Miller):

如果要添加自定义渲染器,通常可以扩展一些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&F背景和样式以及所有内容编程的标签。但是,当然,之后没有办法渲染我的东西。

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

我显然缺少了一些东西。是否Component需要覆盖其他方法并转发到原始方法?如果不通过覆盖来绘制默认组件,该如何绘制paint(我也尝试覆盖paintComponent。没有区别。)

还有另一种方法吗?我曾考虑过尝试在其中放置本机样式JPanel,然后将其自定义(透明背景)组件作为其子组件,尽管我不确定如何去做,而且我不确定是否会无论如何,本机L&F表标题背景。实际上,我非常怀疑我会得到本机标题样式,只是本机JPanel样式。

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

谢谢!

垃圾神:

你可能看在采取的办法updateUI()SelectAllHeaderTest,以及在接受的答案乐于助人的注意事项。

附录:作为说明,请注意,标头的外观位于主机平台相应的UI委托(通常从派生)的支持下TableHeaderUI您可能希望将更改限制在流行的外观实现通用UIManager默认值上另外,请勿覆盖paint()我会避免压倒一切paintComponent(); 并根据需要覆盖paintIcon(),如中所示TableSorter

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JTable单元格渲染器

为什么单元格渲染器经常扩展JLabel?

选择行/单元格时,为什么我的Java自定义单元格渲染器不显示突出显示?

JTable自定义单元格渲染器焦点问题

设计适合Nimbus外观的简单单元格渲染器

角农业网格单元格渲染器复选框未刷新值

ag-grid渲染在单元格渲染器顶部

如何在Ag-Grid中有条件地启用/禁用单元格渲染器?

JTable不遵守单元格渲染器的必要高度

Ag Grid单元格渲染器不会实例化,直到向后滚动

ag-grid单元格渲染器,显示来自多列的数据

存储未传递到已连接的单元格渲染器框架

带滑块的Ag-grid单元格渲染器不起作用

如何在单元格渲染器中使用按钮删除Ag-grid行

在pe:sheet中添加自定义单元格渲染器

单元格渲染器和失去的焦点

列表视图和使用自定义渲染器查看单元格的单元重用问题

JTable使用动态大小设置列宽,并使用JTextArea作为单元格渲染器

JComboBox单元格渲染器因Windows外观而失败

具有显示表格单元格CSS属性的元素内“覆盖”背景上的奇怪边框-Chrome

如何在html中组成覆盖表格的单个单元格(具有自己的内容)的元素?

获取单元格渲染器内的值列键?

如何在具有动态添加的行和单元格的表格中拖放单元格内容?

Angular ag-Grid:自定义单元格渲染器,可在行中的所有可编辑单元格上打开编辑模式

表格和表格单元格的 CSS 样式覆盖

谷歌表格删除具有特定背景颜色的单元格

如果绑定属性具有特定值,如何用圆圈覆盖单元格的内容?

JComboBox 自定义单元格渲染器 - 如何获得 Combo 的 isEnabled() 状态?

AgGrid:如何获取自定义单元格渲染器的实例?