2017-06-13 130 views
-1

我有一個Java表格,其中包含目錄中的內容。我創建了5個組合框,將用戶導航到文件夾中,然後使用選定文件夾的內容(如文件名,日期,創建者等)創建一個JTable。在表格的第6列中,我有一些字符串值,並且取決於每個值我想改變這個單元格的背景顏色。 這裏是我啓動JTable的最後一個comboBox。在動態JTable上更改單元格的背景顏色

+1

快速注:'抓(NullPointerException異常N){}'?你永遠不應該趕上NPE,這表明你有這個代碼嚴重錯誤。 –

+2

如果您需要進一步的幫助,您需要創建併發布有效的[mcve],一個作爲代碼格式文本發佈在您的問題中的新小程序。 –

+2

我現在看到你的[以前沒有回答的問題](https://stackoverflow.com/questions/44279125/add-selected-data-from-jtable-to-lst-file)中請求了一個MCVE,但是你永遠不會提供了一個(就像你不在這裏)。請不要忽視這些要求,如果你想得到一個體面的答案你的問題。我們要求提供這些信息是有原因的 - 這樣我們才能完全理解您的代碼,您的問題和您的問題。 –

回答

3

對不起,你試圖抓住NPE catch(NullPointerException n){} - 是非常錯誤的 - 從不這樣做,而是修復可能導致NPE發生的錯誤。

至於你的問題,你沒有超載的實際方法。你的方法簽名:

public Component prepareRenderer(TableCellRenderer renderer, int rowIndex) 

不符合實際的方法簽名:

public Component prepareRenderer(TableCellRenderer renderer, 
          int row, 
          int column) 

按照該JTable API,你錯過了第三個參數,列int參數。

這就是爲什麼你應該總是預置重寫的方法與@Override註釋。如果你這樣做:

@Override // this will cause the compiler to complain that this isn't an override 
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex) 

而你在這個方法循環看起來相當可疑。我會擺脫它,因爲渲染器應該僅渲染由行和列索引指定的單元格。

例如,

DefaultTableModel listModel = new DefaultTableModel(); 
JTable table1 = new JTable(listModel){ 

    @Override // don't forget this! 
    public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int columnIndex) { 
     JComponent component = (JComponent) super.prepareRenderer(renderer, i, columnIndex); 
     int lastRow = listModel.getRowCount(); 
     // this will likely set the whole row. If you only want to set only a specific cell, then 
     // you'll need to first check the columnIndex. 
     if (getValueAt(rowIndex, 6).toString().contains("yellow")) { 
      component.setBackground(Color.RED); 
     } else { 
      component.setBackground(null); // turn color back to default 
     } 
     return component; 
    } 
}; 
3

你不應該延長JTableDefaultTableCellRenderer,並設置爲你的表的默認渲染:

public class TableRendererExample { 
    public static void main(String[] args) { 
     TableCellRenderer renderer = new DefaultTableCellRenderer(){ 
      @Override 
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, 
        boolean hasFocus, int row, int column) { 
       Component rendererComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
       rendererComponent.setBackground("value2".equals(value)?Color.RED:Color.WHITE); 
       return rendererComponent; 
      } 
     }; 
     TableModel tableModel= new DefaultTableModel(10, 3){ 
      @Override 
      public Object getValueAt(int arg0, int arg1) { 
       return "value"+new Random().nextInt(4); 
      }  
     }; 
     JTable jTable = new JTable(tableModel); 
     jTable.setDefaultRenderer(Object.class, renderer); 
     JOptionPane.showMessageDialog(null, jTable); 
    } 
} 


可能的,這是一個更好的長期解決方案,因爲它也允許OP爲特定列設置單元格渲染器。 - 氣墊船全鱔

更妙的是,你不需要知道列索引提前當你覆蓋getColumnClass()TableModel

同一渲染器類中的所有列:

class DefaultTableCellRendererBackground extends DefaultTableCellRenderer { 
    private final Color highlightColor; 

    DefaultTableCellRendererBackground(Color highlightColor) { 
     this.highlightColor = highlightColor; 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 
      int row, int column) { 
     Component rendererComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, 
       column); 
     rendererComponent.setBackground(highlightColor); 
     return rendererComponent; 
    } 
} 

TableModel返回不同的ColumnClass,每次運行:

final class DefaultTableModelExtension extends DefaultTableModel { 
    private final List<Class<?>> columnClass; 

    DefaultTableModelExtension(int rowCount, int columnCount, List<Class<?>> columnClass) { 
     super(rowCount, columnCount); 
     this.columnClass = columnClass; 
     Collections.shuffle(this.columnClass); 
    } 

    @Override 
    public Class<?> getColumnClass(int col) { 
     return columnClass.get(col); 
    } 

    @Override 
    public Object getValueAt(int arg0, int arg1) { 
     return "value" + new Random().nextInt(4); 
    } 
} 

類型t Ø返回:

interface TagRed {} 

interface TagBlue {} 

interface TagYellow {} 

使用(運行多次...):

public class TableRendererExample { 
    public static void main(String[] args) { 
     JTable jTable = new JTable(); 
     jTable.setDefaultRenderer(TagRed.class, new DefaultTableCellRendererBackground(Color.RED)); 
     jTable.setDefaultRenderer(TagBlue.class, new DefaultTableCellRendererBackground(Color.BLUE)); 
     jTable.setDefaultRenderer(TagYellow.class, new DefaultTableCellRendererBackground(Color.YELLOW)); 

     List<Class<?>> columnClass = Arrays.asList(TagRed.class, String.class, TagBlue.class, TagRed.class, String.class, 
       TagYellow.class, TagBlue.class); 
     jTable.setModel(new DefaultTableModelExtension(10, columnClass.size(), columnClass)); 
     JOptionPane.showMessageDialog(null, jTable); 
    } 
}