如果要添加自定义渲染器,通常可以扩展一些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] 删除。
我来说两句