2012-05-25 164 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

相关问题