2011-08-24 121 views
5

我試圖獲得舒適與JTable中,TableModels,JTableHeaders,渲染等我試圖做一個簡單的虛擬表(實踐的目的),看起來像這樣:更改鞦韆JTable中單元格的顏色

- 1 2 3 
A A1 A2 A3 
B B1 B2 B3 
C C1 C2 C3 

我也希望B2單元格(只有該單元格)具有藍色(Color.BLUE)背景 - 所有其他單元格都可以具有默認自動分配的Swing默認顏色。

我的代碼如下,並基於我在本網站和互聯網上發現的無數例子。但是我沒有得到我想要的結果。相反,我得到一個表,看起來像這樣:

A A1 A2 A3 
B B1 B2 B3 
C C1 C2 C3 

注意,第一行(標題)是不存在的。此外,使用下面的代碼我列出,這將執行並設置顏色的單元格,而不僅僅是我想要的B2單元格的顏色全部

代碼

public class MyTable 
{ 
    public static void main(String[] args) 
    { 
     String[][] data = getTableData(); 
     String[] cols = getTableCols(); 

     JFrame frame = magicallyCreateJFrame();  // I promise this works! 
     MyRenderer myRenderer = new MyRenderer(); // See below 

     DefaultTableModel defModel = new DefaultTableModel(data, cols); 
     JTable myTable = new JTable(defModel); 

     myTable.setDefaultRenderer(Object.class, myRenderer); 

     frame.add(myTable); 
     frame.pack(); 
     frame.setVisible(true);    
    } 
} 

public static String[] getTableCols() 
{ 
    String cols = 
    { 
     "-", 
     "1", 
     "2", 
     "3", 
    }; 
} 

public static String[][] getTableData() 
{ 
    String[][] data = 
    { 
     { 
      "A", 
      "A1", 
      "A2", 
      "A3", 
     }, 
     { 
      "B", 
      "B1", 
      "B2", 
      "B3", 
     }, 
     { 
      "C", 
      "C1", 
      "C2", 
      "C3", 
     }, 
    }; 

    return data; 
} 

和快速正髒MyRenderer類:

public class MyRenderer extends DefaultTableCellRenderer 
{ 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
{ 
    Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

    if(row == 2 && column == 2) 
     c.setBackground(new java.awt.Color(0, 0, 255)); 

    return c; 
} 

} 

除了這個事實,這是可怕代碼並打破了很多的「最佳實踐「類型的模式和技巧(請記住,這只是我玩弄的東西),有什麼我在這裏做什麼,明顯顯而易見?爲什麼我沒有收到表頭(第一行「 - 1 2 3」)?爲什麼我的默認單元格渲染器不能在我指定的特定B2單元格上工作?

JTables似乎是奇怪,美麗和強大的野獸。我正在慢慢地圍繞他們思考,但是卻在執行上感到窒息。感謝任何可以幫助!

+0

仍在等待SSCCE ... – camickr

+0

另請參閱此[相關示例](http://stackoverflow.com/a/12352838/230513)。 – trashgod

回答

14

你需要確保你重置渲染器的默認背景顏色(和處理行選擇):

if (! table.isRowSelected(row)) 
{ 
    if(row == 2 && column == 2) 
     c.setBackground(new java.awt.Color(0, 0, 255)); 
    else 
     c.setBackground(table.getBackground()); 
} 

在將來發布合適的SSCCE你的問題。

3

你在哪裏指定渲染器爲B2顏色,只有B2?也許你想在你的getTableCellRendererComponent方法中放置一個if塊,以便只有當JTable的值對象的toString()是「B2」或者行和列值對應於B2單元格時,背景顏色才設置爲藍色。

而要查看您的表格標題,您應該先將表格添加到JScrollPane,然後將JScrollPane添加到父級。

最重要的是:閱讀JTable上的Swing教程,因爲這裏全部解釋了這些。

+0

感謝氣墊船 - 請參考Renderer類中添加的條件。它仍然沒有工作 - 我錯過了什麼? – IAmYourFaja

4

半答案:

你需要把你的JTableJScrollPane有顯示的標題。或者,您也可以手動將由myTable.getTableHeader()返回的組件添加到佈局中。不過我推薦使用JScrollPane

編輯:

如下建議,把背景藍色的只是一個特定的細胞,你需要做的就是添加一個測試像這樣的:

if(column == 2 && row == 1) { 
    c.setBackground(Color.BLUE); 
} else { 
    c.setBackground(Color.WHITE); 
} 
+0

並且:如果在'myTable.setDefaultRenderer(Object.class,myRenderer);'用'String.class'替換Object.class'會發生什麼? – ChrisJ

+0

這會如何幫助他解決問題? –

+0

我表格中的所有數據都是字符串。我是否需要將該調用更改爲使用String.class,如果是這樣,那會破壞什麼?我需要改變什麼才能解決這個問題呢? – IAmYourFaja

0

也許,myTable.setDefaultRenderer(String.class, myRenderer);將工作正確。

0

我相信做表着色的正確方法是通過ColorHighlighter。我給了一個example here