2012-05-25 86 views
1

我在表中搜索,當我找到一個匹配,我想改變該單元格的顏色。 我做了如下,但仍不能解決它?任何機構可以幫助解決這個問題嗎?如何更改java中JTable中單個單元格的背景顏色?

public class SearchTable extends JTable { 
JTable table; 
JTextField textField; 

public SearchTable(JTable table, JTextField textField) { 
    this.table = table; 
    this.textField = textField; 

    textField.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      search(); 
     } 
    }); 

    textField.getDocument().addDocumentListener(new DocumentListener() { 
     public void insertUpdate(DocumentEvent e) { 
      search(); 
     } 
     public void removeUpdate(DocumentEvent e) { 
      search(); 
     } 
     public void changedUpdate(DocumentEvent e) { 
      search(); 
     } 
    }); 
} 

private void search() { 
    String target = textField.getText(); 
    for (int row = 0; row < table.getRowCount(); row++) 
     for (int col = 0; col < table.getColumnCount(); col++) { 
      String next = (String) table.getValueAt(row, col); 
      if (next.equals(target)) { 
       changeBackgroundColor(row, col); 
       return; 
      } 
     } 
    table.repaint(); 
} 

private void changeBackgroundColor(int row, int col) { 
    table.setColumnSelectionAllowed(true); 
    table.setRowSelectionAllowed(true); 
    boolean toggle = false; 
    boolean extend = false; 
    table.changeSelection(row, col, toggle, extend); 
    //first atempt sets bg color for all cells, it is not OK 
    //table.setSelectionBackground(Color.green); 

    //second atempt getting no result 
    table.getCellEditor(row,col).getTableCellEditorComponent(table,table.getValueAt(row,col),true,row,col).setForeground(Color.red); 

    //3th atempt getting no result 
    //Component c = table.getCellRenderer(row, col).getTableCellRendererComponent(table, table.getValueAt(row, col), true, true, row, col); 
    //c.setForeground(Color.red); 

    //4th atempt getting no result 
    //DefaultTableCellRenderer renderer = (DefaultTableCellRenderer) table.getCellRenderer(row, col).getTableCellRendererComponent(table, table.getValueAt(row, col), true, true, row, col).; 
     //renderer.setBorder(new LineBorder(Color.red)); 
} 

    } 

回答

3

您可以使用XxxCellRenderer,更好,最簡單的就是使用prepareRenderer()

爲正確的代碼,你必須內部覆蓋或測試的if-else如下patameters

  • isSelected

  • hasFocus

請檢查answers和一個question約similair問題上,有兩種簡單的方法,對不起,我在週五TRAFIC,brrrrr

+1

集中精力駕駛。 ;) –

+0

@Andrew Thompson eeerrrghhtt終於我在家裏:-),在手機上寫了一些可怕的東西 – mKorbel

0

您需要設置首先將單元格渲染器添加到列中 -

col.setCellRenderer(new TableCellRenderer() { 
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
       { 
        Component cell = centerRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
    cell.setForeground(Color.green); 
} 
}); 
+0

我認爲重寫'prepareRenderer()'對於單個單元格可能更容易,正如[這裏]建議的(http:// stackoverflow.com/a/10755774/230513)。 – trashgod

+0

我同意trashgod :) – Mohsin

相關問題