如果你想添加自定义渲染器,通常,你要么扩展一些 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 混淆太多。
谢谢!
最佳答案
您可以查看 SelectAllHeaderTest
中 updateUI()
中采用的方法,以及已接受答案中的有用警告。
附录:作为解释,请注意 header 的外观属于主机平台相应 UI 委托(delegate)的支持,通常来自 TableHeaderUI
。 .您可能希望将更改限制在 UIManager Defaults常见于流行的外观和感觉实现。另外,不要覆盖 paint()
。我会避免重写 paintComponent()
;并且,如有必要,覆盖 paintIcon()
,如 TableSorter
中所示.
关于Java:覆盖表格单元格渲染器,但使用默认背景和属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7465881/