JTable CellRenderer меняет цвет переднего плана только в фокусе - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь реализовать cellrenderer, который меняет цвет в зависимости от значения целого числа. Тем не менее, цвет ячейки изменяется только при фокусировке. См. Рисунок ниже.

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
        int column) {
    super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

    switch (column) {
        case 1:this.setFont(this.getFont().deriveFont(Font.BOLD)); break;
        case 3:this.setFont(this.getFont().deriveFont(Font.BOLD)); break;
    }
    if (column == 4 && (Integer)value > 0) {
        setForeground(Color.green);
    } else {
        setForeground(Color.red); 
    }
    return this;
}

enter image description here

1 Ответ

1 голос
/ 26 марта 2020

Полагаю, ваша таблица не запускает правильное событие обновления, поэтому перерисовка ячейки отсутствует.

MRE, включающая весь данный код, который не может воспроизвести проблему:

import java.awt.*;
import javax.swing.*;

class Code extends javax.swing.table.DefaultTableCellRenderer {
    public static void main(String[] args) throws Throwable {
        java.awt.EventQueue.invokeLater(Code::go);
    }
    private static void go() {
        JTable table = new JTable(
            new Object[][] {  { 0, 1, 2, 3, 4 }, { 1, 2, 3, 4, 5 } },
            new Object[] { "0", "1", "2", "3", "3" }
        );
        table.setDefaultRenderer​(Object.class, new Code());
        JFrame frame = new JFrame("Table");
        frame.add(table);
        frame.pack();
        frame.setVisible(true);

        new Timer(1000, event -> {
            table.setValueAt(
                -(Integer)table.getValueAt(0, 4),
                0, 4
            );
        }).start();
    }
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        switch (column) {
            case 1:this.setFont(this.getFont().deriveFont(Font.BOLD)); break;
            case 3:this.setFont(this.getFont().deriveFont(Font.BOLD)); break;
        }
        if (column == 4 && (Integer)value > 0) {
            setForeground(Color.green);
        } else {
            setForeground(Color.red); 
        }
        return this;
    }
}
...