2015-09-06 121 views
0

我有一個名爲sponsorIndexArr的inint數組,它包含我想要更改表格顏色的單元格索引(我也希望使該單元格不可選)。該表是一列,所以我只需要單元格的行索引。Java - 更改JTable中某些單元格的顏色

下面是一些相關的代碼:

// Configure sponsor table 
sponsorstableModel = new DefaultTableModel(sponsorsTableList, new String[]{"Sponsors"} 
    @Override 
    public boolean isCellEditable(int row, int column) { 
     return false; 
    } 
}; 
sponsorsTable = new JTable(sponsorstableModel); 
sponsorsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
sponsorsTable.addMouseListener(this); 

sponsorsTable.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() { 
     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
      for (int entry : sponsorIndexArr) { 
       System.out.println(entry + " " + row); 
       if (entry == row) { 
        System.out.println("HERE"); 
        this.setBackground(Color.CYAN); 
        this.setEnabled(false); 
       } else { 
        setBackground(null); 
        this.setEnabled(true); 
       } 
      } 
      return this; 
     } 
    }); 

程序在正確的位置打印 「HERE」。但是,發生的情況是隻有具有最後索引sponsorIndexArr的單元正在改變顏色。當我擺脫setBackground(null)然後每個細胞變成青色。

此外,當我選擇任何其他單元格背景覆蓋文本。當我擺脫this.setEnabled(true)然後我沒有這個問題,但隨後每個單元格被禁用(文本變灰)。

+0

參見[*臭名昭著的彩色記憶™*](http://stackoverflow.com/a/9617446/230513)。 – trashgod

回答

4

發生的事情是隻有最後索引sponsorIndexArr的單元正在改變顏色。

您的渲染器的概念是錯誤的。你的渲染器有一個循環,表示你正試圖一次渲染所有的單元格。這不是渲染器的工作原理

每個單元格都使用相同的渲染器。每次需要渲染單元格時,都會調用渲染器。因此,如果您有10行,則渲染器將被調用10次,並且渲染器的狀態將更新10次以反映單元格的狀態。

我有一個名爲sponsorIndexArr int數組它包含我想改變顏色

我建議,而不是你應該使用整數Set細胞的指標。然後你的渲染器會做一個簡單的檢查,看看行索引是否在集合中,然後決定如何渲染單元格。

的代碼可能是這樣的:

@Override 
public Component getTableCellRendererComponent(
    JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
{ 
    super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

    if (isSelected) 
     setBackground(table.getSelectionBackground()); 
    else if (yourSet.contains(row)) 
     setBackground(Color.CYAN); 
    else 
     setBackground(table.getBackground()); 

    return this; 
}