Я использую Нимбус. Чтобы упростить переопределение prepareRenderer в JTable, первое, что я обычно делаю, это получаю компонент из суперметода, поэтому я могу настроить только те свойства, которые мне нужны, оставив все остальное без изменений.
Проблема в том, что когда я изменяю свойство стиля этого компонента, например цвет фона, он выполняет каждый последующий рендеринг с этим цветом, потому что он, по-видимому, повторно использует этот JLabel. Таким образом, каждая новая отображаемая ячейка становится красной, а не только та, которую я хотел.
Я всегда использовал HTML, чтобы избежать этого, но мне нужно манипулировать свойствами переднего плана/фона JLabel. Есть ли у кого-нибудь блок кода, устанавливающий все свойства по умолчанию для средства визуализации, и я могу использовать его в заполнителе метода applyDefaults, приведенном ниже?
Я использую Nimbus, поэтому не знаю, усложняет ли это задачу. Но я хочу, чтобы передний план/фон для выбранных/невыделенных и нечетных/четных строк отображались по умолчанию, и после этого все манипулировалось.
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int col) {
final Component c =super.prepareRenderer(renderer, row, col);
applyDefaults(c, row, col); //what do I need to restore default styles here?
boolean highlightRed condtion == //some boolean condition
boolean isSelected = //calculate whether row is selected
if (c instanceof JLabel) {
if (isSelected == false && highlightRed) {
((JLabel) c).setBackground(Color.RED);
}
}
ОБНОВЛЕНИЕ: согласился с предложением camickr и создал удобный интерфейс по умолчанию для Nimbus JTables. restoreDefaultRenderer сбрасывает все свойства на цвета и выравнивание Nimbus по умолчанию.
public interface JTableCustomRender {
static final Color foreGround = Color.black;
static final Color oddBackGround = new Color(255,255,255);
static final Color evenBackGround = new Color(242,242,242);
static final Color selectedForeGround = new Color(255,255,255);
static final Color selectedBackGround = new Color(57,105,138);
//static final ImmutableList<Class<?>> leftAlignTypes = ImmutableList.of(String.class, Date.class, DateTime.class);
static final ImmutableList<Class<?>> rightAlignTypes = ImmutableList.of(Integer.class, Double.class, Float.class, BigDecimal.class);
public Component prepareRenderer(TableCellRenderer renderer, int viewRow, int viewCol);
public default Component restoreDefaultRenderer(JTable table, Component c, int viewRow, int viewCol) {
if (c instanceof JLabel) {
final boolean rowSelected = Arrays.stream(table.getSelectedRows()).filter(i -> i == viewRow).findAny().isPresent();
JLabel label = (JLabel) c;
if (rowSelected) {
label.setForeground(selectedForeGround);
label.setBackground(selectedBackGround);
}
else {
if (viewRow % 2 == 0) {
label.setBackground(evenBackGround);
}
else {
label.setBackground(oddBackGround);
}
label.setForeground(foreGround);
}
Object value = table.getValueAt(viewRow, viewCol);
if(rightAlignTypes.contains(value.getClass())) {
label.setHorizontalAlignment(SwingConstants.RIGHT);
}
else {
label.setHorizontalAlignment(SwingConstants.LEFT);
}
}
return c;
}
}