2010-10-10 45 views
2

我想呈現我的jtable的特定行(它應該有不同的背景顏色,它應該有粗體字符)。自定義TableCellRenderer不工作(錶行渲染)

我發現關於如何實現自定義TableCellRendererherehere)和教程How to Use Tables而這一次(Table Row Rendering)的幾個問題。我使用JInternalFrame來顯示JTable。我試圖實施這兩種解決方案,但不是getCellRenderer也不是prepareRenderer被調用。在調試的時候,我可以看到我的新jtable被創建,但是我的方法中的斷點沒有被調用。

我的代碼如下所示:

this.add(createData(model)); 

private JComponent createData(ProfitLossTableModel model) { 
    JTable table = new JTable(model) { 

     public TableCellRenderer getCellRenderer(int row, int column) { 
      if ((row == 0) && (column == 0)) { 
       DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); 
       renderer.setHorizontalAlignment(JLabel.RIGHT); 
       renderer.setBackground(Color.red); 
       return renderer; 
      } else { 
       return super.getCellRenderer(row, column); 
      } 
     } 
    }; 

    table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
    table.changeSelection(0, 0, false, false); 
    table.setAutoCreateRowSorter(true); 
    return new JScrollPane(table); 
} 

正如你所看到的,型號是我實施AbstractTableModel的。

當然,我失去了一些東西。我試着打電話repaint()看看是否發生了什麼,但沒有發生。

我也嘗試在我的JInternalFrame中放入一個JPane,並將它們添加到它的JScrollPane中,但是也沒有發生任何事。

任何幫助?

TIA,

鮑勃

+0

您發佈的代碼看起來很好。但是,我們不知道如何實際使用此代碼的上下文。所以你的第一份工作是使用DefaultTableModel創建一個SSCCE(http://sscce.org),看看你是否可以使代碼工作。如果不是,你會發布整個15行SSCCE程序,以便我們可以確切地看到你在做什麼。一旦這個工作,你嘗試使用你的自定義TableModel。 – camickr 2010-10-10 15:55:39

回答

2

Concepts: Editors and Renderers所討論的,「表調用的表模型的getColumnClass方法,它獲取該列的單元的數據類型」。您應該驗證您的AbstractTableModel的實現是否返回適合的值,如example中所建議的那樣。

附錄:

我試圖呈現一個排,而不是一列。

羅布卡米克的Table Row Rendering方法,覆蓋prepareRenderer()似乎apropos。

tabbedPane.addTab("FirstRow", createFirstRow(model)); 
... 
private JComponent createFirstRow(DefaultTableModel model) { 

    final Font font = new Font("Serif", Font.BOLD, 14); 

    JTable table = new JTable(model) { 

     public Component prepareRenderer(
       TableCellRenderer renderer, int row, int column) { 
      Component c = super.prepareRenderer(renderer, row, column); 
      if (!isRowSelected(row)) { 
       c.setBackground(row == 0 ? Color.yellow: getBackground()); 
       c.setFont(row == 0 ? font : getFont()); 
      } 
      return c; 
     } 
    }; 

    table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
    table.changeSelection(1, 1, false, false); 
    return new JScrollPane(table); 
}