2011-09-19 73 views
4

如果你想添加自定義渲染器,通常情況下,你可以擴展一些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.

謝謝!

+1

_paint默認L&F背景,然後用其他的L&F默認像前景色,在它的上面畫font._ - 如果一切都應該是默認使用..默認;-)因爲這不能成爲你的意圖:什麼_exactly_你想不同於默認? – kleopatra

回答

3

您可能會看到在updateUI()SelectAllHeaderTest中採用的方法,以及接受答案中的有用注意事項。

附錄:作爲解釋,請注意標頭的外觀屬於主機平臺相應UI委託人的主持,通常來自TableHeaderUI。您可能希望將您的更改限制在流行的Look &常見的UIManager Defaults感受實現。另外,請勿覆蓋paint()。我會避免重寫paintComponent();並在必要時覆蓋paintIcon(),如TableSorter所示。

+0

感謝您的幫助!我快到了。根據您的建議,我現在擁有正確的背景。但是,你說不要覆蓋paint()。我需要重寫什麼,才能在背景上繪製自定義小部件?謝謝。 –

+0

實際上,使用這種方法,它適用於Mac本機,但不適用於Nimbus。 –

+1

「Swing程序應該重寫'paintComponent()',而不是重寫'paint()'。」 - [在AWT和Swing中繪畫](http://java.sun.com/products/jfc/tsc/articles/painting/的index.html)。請提供[sscce](http://sscce.org/),顯示您的修訂方法。 – trashgod

0

檢查DefaultTableCellRenderer源代碼,在那裏你會看到默認的行爲如何讀取默認的顏色,如:

 fg = DefaultLookup.getColor(this, ui, "Table.dropCellForeground"); 
     bg = DefaultLookup.getColor(this, ui, "Table.dropCellBackground");