Swing – 根据单元格的值设置单元格的颜色
我想根据单元格的值设置单元格的颜色。 谷歌搜索了一下我发现我可以使用这样的东西:
public class TableCellRenderer extends DefaultTableCellRenderer { @Override public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { // get the DefaultCellRenderer to give you the basic component Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); // apply your rules if (value.toString().equals("Red")) c.setBackground(Color.RED); else c.setBackground(Color.GRAY); return c; } }
我遇到的问题是我想要修改的代码已经为JTable的列设置了TableCellRendererer。 代码中有一个函数如下所示:
private void configureTableColumns() { Enumeration columns = this.table.getColumnModel().getColumns(); while (columns.hasMoreElements()) { TableColumn tableColumn = (TableColumn) columns.nextElement(); this.setCellRenderer(tableColumn); TableCellRenderer renderer = tableColumn.getCellRenderer(); if (renderer == null) { renderer = this.table.getDefaultRenderer(Object.class); } tableColumn.setCellRenderer(renderer); this.setCellEditor(tableColumn); } }
使用上面的代码,我还需要添加前面显示的TableCellRenderer类吗? 我想要做的就是检查单元格的值是否为“ABC”并将背景设置为RED。
更新:
我确实尝试将我的TableCellRenderer版本添加为我想要修改的代码中的内部类,但是我得到一个错误,即tableColumn.getCellRenderer()中存在类型不匹配。
Type mismatch: cannot convert from TableCellRenderer to MyTableExample.TableCellRenderer
谢谢
覆盖prepareRenderer
方法来做到这一点。
例:
public Component prepareRenderer (TableCellRenderer renderer, int rowIndex, int columnIndex){ Component componenet = super.prepareRenderer(renderer, rowIndex, columnIndex); if(getValueAt(rowIndex, columnIndex).toString().equals("Red")) { componenet.setBackground(Color.RED); } else if(getValueAt(rowIndex, columnIndex).toString().equals("Green")) { componenet.setBackground(Color.GREEN); } return componenet; }
更新:
import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; public class PrepareRendereEx { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setSize(new Dimension(400, 100)); Object data[][] = { {"java", "j2ee"}, {"java", "j2ee"}, {"java", "j2ee"} }; Object[] columnNames = {"Java", "J2EE"}; DefaultTableModel model = new DefaultTableModel(data, columnNames); JTable table = new JTable(model) { @Override public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int columnIndex) { JComponent component = (JComponent) super.prepareRenderer(renderer, rowIndex, columnIndex); if(getValueAt(rowIndex, 0).toString().equalsIgnoreCase("java") && columnIndex == 0) { component.setBackground(Color.RED); } else if(getValueAt(rowIndex, 1).toString().equalsIgnoreCase("j2ee") && columnIndex == 1){ component.setBackground(Color.GREEN); } return component; } }; frame.add(new JScrollPane(table)); frame.setVisible(true); } }
OUTPUT: