Java:覆盖表单元格呈现程序,但使用默认背景和属性
如果您想添加自定义渲染器,通常,您可以扩展一些Java:覆盖表单元格呈现程序,但使用默认背景和属性,java,swing,jtable,tablecellrenderer,jtableheader,Java,Swing,Jtable,Tablecellrenderer,Jtableheader,如果您想添加自定义渲染器,通常,您可以扩展一些JComponent(如JLabel),并实现tablecelrenderer,或者扩展defaulttabellrenderer。但是,在任何一种情况下,我发现单元格样式都被完全覆盖 我真正想要的是能够绘制默认的L&F背景,然后使用其他L&F默认值(如前景色和字体)在其上绘制 所以,我试着这么做。首先,课堂: public class IntervalHeaderRenderer extends JLabel implements TableCel
JComponent
(如JLabel
),并实现tablecelrenderer
,或者扩展defaulttabellrenderer
。但是,在任何一种情况下,我发现单元格样式都被完全覆盖
我真正想要的是能够绘制默认的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));
我基本上只是按照这里的建议:
如果我返回组件
,它将呈现为我没有覆盖任何内容。也就是说,我得到了标题和标签,我已经与选择的L&F背景和风格和一切编程但是,当然,之后没有办法渲染我的东西
另一方面,如果我返回this
,那么我将一无所获。Mac native L&F给了我白色背景,而Nimbus给了我其他颜色的纯色
我显然错过了什么。组件
上是否有其他方法需要覆盖并转发到原始方法?如果不覆盖绘制
,如何绘制默认组件?(我也尝试过重写paintComponent
。没有区别。)
还有别的办法吗?我曾想过尝试将一个本机样式的JPanel
放在其中,然后将一个自定义(透明背景)组件作为其子组件,尽管我不确定该如何操作,而且我也不确定我是否会得到本机L&F表标题背景。事实上,我非常怀疑我会得到原生的头样式,仅仅是原生的JPanel
样式
基本上,我需要一个自定义的表头(实际上也需要单独的单元格),但我希望避免与本机L&F混淆太多
谢谢 您可以查看中的
updateUI()
中采用的方法,以及公认答案中的有用注意事项
附录:作为解释,请注意标题的外观属于主机平台相应的UI委托的保护范围,通常派生自。您可能希望将更改限制在常见到流行的外观实现上。另外,不要覆盖
paint()
。我会避免重写paintComponent()
;并且,如有必要,覆盖paintIcon()
,如所示。检查DefaultTableCellRenderer
源代码,您将看到默认行为如何读取默认颜色,如:
fg = DefaultLookup.getColor(this, ui, "Table.dropCellForeground");
bg = DefaultLookup.getColor(this, ui, "Table.dropCellBackground");
谢谢你的帮助!我快到了。根据你的建议,我现在有了正确的背景。但是,您说不要覆盖paint()。为了在背景上绘制自定义小部件,我需要覆盖什么?谢谢。实际上,使用这种方法,它看起来适合Mac native,但不适合Nimbus。“Swing程序应该重写
paintComponent()
,而不是重写paint()
”。请提供一份说明修改方法的表格。绘制默认L&F背景,然后使用其他L&F默认值(如前景色和字体)在其上绘制。-如果所有内容都是默认设置,只需使用。。默认值;-)因为这不可能是您的意图:您希望与默认值有什么不同?