您的渲染器曾经使用过吗?您将其设置为包含String的单元格的默认渲染器,但是是否重载了模型的
getColumnClass方法,以便它知道某些单元格包含String
?
因此,首先,我将使用println语句查看渲染器是否被调用,否则,我将覆盖上面提到的模型方法。
编辑1
同样,您的if结果注定是奇怪的。在if部分中,您更改了前景;在else部分中,您更改了背景-
没有任何意义。您可能应该在if与else块中进行互补的状态变化,而不是正交变化。
编辑2
例如:
import java.awt.*;import java.util.Random;import javax.swing.*;import javax.swing.table.*;public class Board extends JPanel { private static final long serialVersionUID = 1L; int boardHeight = 20; int boardWidth = 10; JTable table; Random random = new Random(); public Board() { setLayout(new BorderLayout()); // !! DefaultTableModel model = new DefaultTableModel(boardHeight, boardWidth) { @Override public Class<?> getColumnClass(int columnIndex) { return String.class; } }; // !! table = new JTable(this.boardHeight, this.boardWidth); table = new JTable(model); for (int row = 0; row < model.getRowCount(); row++) { for (int col = 0; col < model.getColumnCount(); col++) { String s = random.nextBoolean() ? "red" : "yellow"; model.setValueAt(s, row, col); } } table.setDefaultRenderer(String.class, new BoardTableCellRenderer()); table.setFocusable(false); table.setShowGrid(false); table.setRowMargin(0); table.setIntercellSpacing(new Dimension(0, 0)); table.setRowSelectionAllowed(false); table.setVisible(true); this.add(table); this.setPreferredSize(new Dimension(table.getPreferredSize().width, (table.getPreferredSize().height + 85))); } private static void createAndShowUI() { Jframe frame = new Jframe("Board"); frame.getContentPane().add(new Board()); frame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { createAndShowUI(); } }); }}class BoardTableCellRenderer extends DefaultTableCellRenderer { private static final long serialVersionUID = 1L; public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); Object valueAt = table.getModel().getValueAt(row, col); String s = ""; if (valueAt != null) { s = valueAt.toString(); } if (s.equalsIgnoreCase("yellow")) { c.setForeground(Color.YELLOW); c.setBackground(Color.gray); } else { c.setForeground(Color.black); c.setBackground(Color.WHITE); } return c; }}


