如果您想添加自定义渲染器,通常,您要么扩展一些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
如果我 return component
,它看起来好像我什么都没有覆盖。也就是说,我得到带有我用所选 L&F 背景和样式以及所有内容编程的标签的标题。 但是,当然,之后没有办法渲染我的东西。
另一方面,如果我返回this
,那么我将一无所获。Mac 原生 L&F 给了我一个白色的背景,而 Nimbus 给了我一个其他颜色的纯色。
我显然错过了一些东西。是否有其他方法Component
需要我覆盖并转发到原始方法?如果不通过覆盖,默认组件如何绘制paint
?(我也尝试过覆盖paintComponent
。没有区别。)
还有另一种方法可以做到这一点吗?我考虑过尝试将原生样式JPanel
放在其中,然后制作一个自定义(透明背景)组件作为它的子组件,尽管我不确定如何去做,而且我不确定我会得到无论如何,本机 L&F 表头背景。事实上,我非常怀疑我会得到原生标题样式,只是原生JPanel
样式。
基本上,我需要一个自定义表格标题(实际上,单元格也是单独的),但我想避免过多地与原生 L&F 混淆。
谢谢!