首页 > 解决方案 > TableCellRenderer 工作正常,表格排序正常,但不会重新绘制

问题描述

这是我的JTable鼠标监听器,我把它放在表中,因为我希望它直接排序。

myTable= new JTable();
myTable.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent arg0) {
        if( myTable.getRowCount()!= 0) {
            TableRowSorter<TableModel> sorter = new TableRowSorter(myTable.getModel());
            myTable.setRowSorter(sorter);
            List<RowSorter.SortKey> date= new ArrayList<>();

            int columnIndexToSort = 10;
            datum.add(new RowSorter.SortKey(columnIndexToSort, SortOrder.DESCENDING));

            sorter.setSortKeys(date);
            sorter.sort();
        }
        myTable.repaint();
        myTable.revalidate();
    }
});

这是 BTW 的单元格渲染器,效果很好,但排序后不会重新绘制:

public class MyTableRenderer 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 resault = table.getModel().getValueAt(row, 9);
        int value= Integer.parseInt(resault.toString()); 
        Color color = null;

        if (value>= 5000) {
            c.setBackground(new Color(144, 238, 144));
        }else if (value< 5000 && value>=500) {
            color = Color.ORANGE;
            c.setBackground(color);
        }else if (value>= 0 && value<500) {
            c.setBackground( new Color(255, 76, 76));
        }
            c.setFont(c.getFont().deriveFont(Font.BOLD));
        return c;
    }
}

这些是我记得要说的关于这个特定问题的一些事情,如果有任何无法理解的地方,所以我会得到答案,请询问。

标签: javaswingbackgroundjtable

解决方案


Object resault = table.getModel().getValueAt(row, 9);

渲染器在表格视图中显示数据。当您对数据进行排序时,TableModel 中的数据不会更改,只会更改视图中数据的顺序。

所以你应该使用:

Object result = table.getValueAt(row, 9);

在当前视图中获取已排序的数据。


推荐阅读