package robotbuilder; import java.awt.Color; import java.awt.Component; import java.util.function.Predicate; import javax.swing.BorderFactory; import javax.swing.DefaultCellEditor; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.table.TableCellRenderer; import lombok.AllArgsConstructor; /** * * @author Sam Carlberg */ @AllArgsConstructor public class ParameterTableRenderer implements TableCellRenderer { /** * The color of a selected row with all valid values. */ public static final Color SELECTED_COLOR = new Color(200, 200, 255); // light blue /** * The color of an unselected row with at least one invalid value. */ public static final Color INVALID_COLOR = new Color(255, 150, 150); // medium red /** * The color of a selected row with at least one invalid value. */ public static final Color SELECTED_INVALID_COLOR = new Color(236, 70, 89); // light red/pink private final Predicate<Integer> rowValidator; @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { final JComponent component; if (value instanceof Boolean) { JCheckBox checkBox = new JCheckBox("", (Boolean) value); component = checkBox; } else { JLabel label = new JLabel(String.valueOf(value)); label.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 0)); component = label; } if (!rowValidator.test(row)) { if (isSelected) { component.setBackground(SELECTED_INVALID_COLOR); } else { component.setBackground(INVALID_COLOR); } } else if (isSelected) { component.setBackground(SELECTED_COLOR); } component.setOpaque(true); return component; } }