是否必须突出显示单元格的决定必须在TableCellRenderer中进行。它不能在JTable中进行。因此,(没有)没有理由要重写JTable中的方法。相反,您可以将列的CellRenderer设置为TableCellRenderer的自己实现。
在此示例中,列2和3接收“
ColoringCellRenderer”。如果此单元格中的值不为null且与列1中的值相同,则此ColoringCellRenderer将突出显示该单元格。
import java.awt.Color;import java.awt.Component;import javax.swing.Jframe;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.SwingUtilities;import javax.swing.table.DefaultTableCellRenderer;import javax.swing.table.DefaultTableModel;import javax.swing.table.TableColumn;public class ColoredTableCells{ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { createAndShowGUI(); } }); } private static void createAndShowGUI() { Jframe f = new Jframe(); f.getContentPane().add(new JScrollPane(createTable())); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } static JTable createTable() { class ColoringTableCellRenderer extends DefaultTableCellRenderer { ColoringTableCellRenderer() { setOpaque(true); } @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 (highlightCell(table, row, column)) { setBackground(Color.CYAN); } else { setBackground(Color.WHITE); } return this; } private boolean highlightCell(JTable table, int row, int column) { Object thisValue = table.getValueAt(row, column); Object referencevalue = table.getValueAt(row, 1); if (thisValue != null && referencevalue != null) { return thisValue.equals(referencevalue); } return false; } } JTable table = new JTable(); table.setModel(new DefaultTableModel(new Object[][] { { "Row1", "1", "2", "3" }, { "Row2", "2", "2", "3" }, { "Row3", "2", "2", "2" }, { "Row3", "2", "1", "2" } }, new String[] { "Header1", "Header2", "Header3", "Header4" })); for (int i=2; i<table.getColumnCount(); i++) { TableColumn column = table.getColumnModel().getColumn(i); column.setCellRenderer(new ColoringTableCellRenderer()); } return table; }}编辑:答案已经被接受,但针对评论,一个不同的版本:
该类使用两个类“ DelegatingTableCellRenderer”和“
DelegatingTableCellEditor”。这些类各自接收各自的委托,并且仅设置委托所传递的单元格组件的背景色。
这样,着色表单元格(用于渲染器或编辑器)的功能就与实际渲染器分离了。因此,可以为默认的CellRenderer的背景着色(例如
Boolean显示JCheckBox的值)。
import java.awt.Color;import java.awt.Component;import java.util.EventObject;import javax.swing.JComponent;import javax.swing.Jframe;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.SwingUtilities;import javax.swing.event.CellEditorListener;import javax.swing.table.DefaultTableCellRenderer;import javax.swing.table.DefaultTableModel;import javax.swing.table.TableCellEditor;import javax.swing.table.TableCellRenderer;public class ColoredTableCells2{ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { createAndShowGUI(); } }); } private static void createAndShowGUI() { Jframe f = new Jframe(); f.getContentPane().add(new JScrollPane(createTable())); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } static JTable createTable() { JTable table = new JTable() { @Override public Class<?> getColumnClass(int column) { if (column == 0) { return Object.class; } return Boolean.class; } }; table.setDefaultEditor(Boolean.class, new DelegatingTableCellEditor(table.getDefaultEditor(Boolean.class))); table.setDefaultRenderer(Boolean.class, new DelegatingTableCellRenderer(table.getDefaultRenderer(Boolean.class))); table.setModel(new DefaultTableModel(new Object[][] { { "Row1", true, false, true }, { "Row2", true, true, false }, { "Row3", false, false, true }, { "Row3", false, true, false } }, new String[] { "Header1", "Header2", "Header3", "Header4" })); return table; } static class DelegatingTableCellEditor implements TableCellEditor { private final TableCellEditor delegate; DelegatingTableCellEditor(TableCellEditor delegate) { this.delegate = delegate; } @Override public Object getCellEditorValue() { return delegate.getCellEditorValue(); } @Override public boolean isCellEditable(EventObject anEvent) { return delegate.isCellEditable(anEvent); } @Override public boolean shouldSelectCell(EventObject anEvent) { return delegate.shouldSelectCell(anEvent); } @Override public boolean stopCellEditing() { return delegate.stopCellEditing(); } @Override public void cancelCellEditing() { delegate.cancelCellEditing(); } @Override public void addCellEditorListener(CellEditorListener l) { delegate.addCellEditorListener(l); } @Override public void removeCellEditorListener(CellEditorListener l) { delegate.removeCellEditorListener(l); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { Component component = delegate.getTableCellEditorComponent( table, value, isSelected, row, column); if (component instanceof JComponent) { JComponent c = (JComponent)component; c.setOpaque(true); } if (highlightCell(table, row, column)) { component.setBackground(Color.CYAN); } else { component.setBackground(Color.WHITE); } return component; } } static class DelegatingTableCellRenderer extends DefaultTableCellRenderer { private final TableCellRenderer delegate; DelegatingTableCellRenderer(TableCellRenderer delegate) { this.delegate = delegate; } @Override public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component component = delegate.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column); if (component instanceof JComponent) { JComponent c = (JComponent)component; c.setOpaque(true); } if (highlightCell(table, row, column)) { component.setBackground(Color.CYAN); } else { component.setBackground(Color.WHITE); } return component; } } private static boolean highlightCell(JTable table, int row, int column) { if (column == 1) { return false; } Object thisValue = table.getModel().getValueAt(row, column); Object referencevalue = table.getModel().getValueAt(row, 1); if (thisValue != null && referencevalue != null) { return thisValue.equals(referencevalue); } return false; }}


