如果你想添加自定義渲染器,通常情況下,你可以擴展一些JComponent
(如JLabel
)和實施TableCellRenderer
,或者你會延長DefaultTableCellRenderer
。然而,在任何一種情況下,我發現的是單元格樣式被完全覆蓋。的Java:覆蓋表單元格渲染器,但默認的背景和性質
我真的很喜歡的是能夠繪製默認的背景,然後使用其他的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
如果我回到它呈現爲好像我沒有重寫任何東西。也就是說,我用標有我選擇的L & F背景和樣式以及所有內容的標籤標題。 但是,當然,之後沒有辦法渲染我的東西。
另一方面,如果我返回this
,那麼我什麼也得不到。 Mac原生L & F給了我一個白色的背景,而Nimbus給了我一些其他顏色的固體。
我很明顯錯過了一些東西。 Component
上有其他方法需要覆蓋並轉發到原始文件嗎?如果不是覆蓋paint
,默認組件是如何繪製的? (我也試過覆蓋paintComponent
。沒有什麼區別)
有沒有另外一種方法可以做到這一點?我想過試圖在其中放置原生風格的JPanel
,然後將自定義(透明背景)組件作爲它的孩子,雖然我不確定如何去做,但我不確定我會無論如何,獲得原生L & F表標題背景。事實上,我非常懷疑我會得到原生的標題風格,只是本地的JPanel
風格。
基本上,我需要一個定製的表頭(和單獨的細胞也一樣,實際上),但我想避免搞亂了太多與天然I & F.
謝謝!
_paint默認L&F背景,然後用其他的L&F默認像前景色,在它的上面畫font._ - 如果一切都應該是默認使用..默認;-)因爲這不能成爲你的意圖:什麼_exactly_你想不同於默認? – kleopatra