Java 分拣后重新给JTable上色

Java 分拣后重新给JTable上色,java,swing,repaint,Java,Swing,Repaint,我有一个JTable,每一行都是根据最后一列中的值着色的 但是,当我单击标题对行进行排序时,颜色不会跟随行 我曾尝试在JTable鼠标退出事件中调用我的“colortable”方法(我知道是Hacky),但没有成功 有人能给我指出正确的方向吗 这是我的JTable 我尝试调用我们的方法的地方 // If table headers are clicked for sorting, reset colours table.getTableHeader().addMouseListener

我有一个JTable,每一行都是根据最后一列中的值着色的

但是,当我单击标题对行进行排序时,颜色不会跟随行

我曾尝试在JTable鼠标退出事件中调用我的“colortable”方法(我知道是Hacky),但没有成功

有人能给我指出正确的方向吗

这是我的JTable

我尝试调用我们的方法的地方

// If table headers are clicked for sorting, reset colours
    table.getTableHeader().addMouseListener(new java.awt.event.MouseAdapter() {
        @Override
        public void mouseExited(java.awt.event.MouseEvent evt) {
            Functions.colourTable(model, table);

        }
    });
static void colourTable(TableModel model, JTable table) {

    table.setDefaultRenderer(Object.class, new StatusColumnCellRenderer());

}
颜色方法

// If table headers are clicked for sorting, reset colours
    table.getTableHeader().addMouseListener(new java.awt.event.MouseAdapter() {
        @Override
        public void mouseExited(java.awt.event.MouseEvent evt) {
            Functions.colourTable(model, table);

        }
    });
static void colourTable(TableModel model, JTable table) {

    table.setDefaultRenderer(Object.class, new StatusColumnCellRenderer());

}
列单元格渲染器类

public class StatusColumnCellRenderer extends DefaultTableCellRenderer {

@Override
public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int col) {

    Component comp = super.getTableCellRendererComponent(table, value,
            isSelected, hasFocus, row, col);

    // Get the mark value from the table (col 4)
    int mark = Integer.parseInt(table.getModel().getValueAt(row, 3).toString());

    Color red = new Color(200, 44, 44);
    Color purple = new Color(163, 108, 223);
    Color green = new Color(36, 135, 44);

    // Fail
    if (mark < 40) {
        comp.setBackground(red.brighter());
        // Pass
    } else if (mark >= 40) {
        // Distinction
        if (mark >= 75) {
            comp.setBackground(purple.brighter());
        } else {
            comp.setBackground(green.brighter());
        }
    } else {
        comp.setBackground(null);
    }

    // Return the component
    return (comp);
}
公共类StatusColumnCellRenderer扩展了DefaultTableCellRenderer{
@凌驾
公共组件GetTableCellRenderComponent(JTable表、对象值、,
布尔值(已选择,布尔值为焦点,整数行,整数列){
组件组件=super.getTableCellRenderComponent(表,值,
i当选、hasFocus、row、col);
//从表中获取标记值(第4列)
int mark=Integer.parseInt(table.getModel().getValueAt(第3行).toString());
红色=新颜色(200,44,44);
紫色=新颜色(163108223);
绿色=新颜色(36、135、44);
//失败
如果(标记<40){
公司挫折背景(红色较亮());
//通过
}否则如果(标记>=40){
//区别
如果(标记>=75){
公司挫折背景(紫色较亮());
}否则{
公司挫折背景(绿色较亮());
}
}否则{
公司背景(空);
}
//返回组件
返回(comp);
}
}

不要从TableModel中获取值。TableModel中的数据从不排序。只有表格视图按排序顺序显示

相反,只需从表中获取值:

int mark = Integer.parseInt(table.getValueAt(row, 3).toString());