如果您想添加自定义渲染器,通常情况下,您要么扩展一些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");