客户的要求,鼠标单击排序,并且绘制箭头表示升序降序。画箭头是在刷新table时做的。代码实现发生问题,单击的时候ok,快速双击的时候,排序正确,但是箭头表示错误。log看了下,发现快速双击的时候,第一击作了一次排序,2次刷新,第二击作了一次排序,但是没有再刷新。具体代码如下:
    public void mouseClicked(MouseEvent e)
    {
      做排序
          sort();
        
         试过了以下4种刷新,但是都是一样的效果。         1---   //table.repaint();
            
         2---   //table.updateUI();
            
         3---   //table.revalidate();
            
         4---   //Rectangle rect = new Rectangle(0,0, table.getWidth(), table.getHeight());
                //table.paintImmediately(rect);
         
    }有没有什么方法可以让每次的点击都作刷新

解决方案 »

  1.   

    ((DefaultTableModel)table.getModel()).fireTableDataChanged();
    呵呵,这也是我今天刚刚学到的
      

  2.   

    鼠标事件 public void mouseClicked(MouseEvent e)
        {
             if(e.getSource() instanceof JTableHeader)
            {
                JTableHeader header = (JTableHeader)e.getSource();
                JTable table = header.getTable();
                table.clearSelection();
                TableColumnModel tcm = table.getColumnModel();
                int viewColumn = tcm.getColumnIndexAtX(e.getX());
                if(viewColumn != -1)
                {
                    int vc = viewColumn;
                    int mc = table.convertColumnIndexToModel(vc);
                    if(table.getModel() instanceof TableSortDecorator)
                    {
                        TableSortDecorator sortDecorator = (TableSortDecorator)table.getModel();
                        sortDecorator.sort(mc);
                        if(table instanceof BaseTable)
                            ((BaseTable)table).adjustRowHeight();
                        
                        ((DefaultTableModel)table.getModel()).fireTableDataChanged(); 
                        
                        table.repaint();
                                            
                    }
                    
                }
               
            }
                 }
      

  3.   

    画箭头
    private class SortableHeaderRenderer implements TableCellRenderer { private TableCellRenderer tableCellRenderer; public SortableHeaderRenderer(TableCellRenderer tableCellRenderer) {
    this.tableCellRenderer = tableCellRenderer;
    } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
    boolean hasFocus, int row, int column) {
    Component c = tableCellRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row,
    column);
    if (c instanceof JLabel) {
    JLabel l = (JLabel) c;
    l.setHorizontalTextPosition(JLabel.LEFT);
    int modelColumn = table.convertColumnIndexToModel(column);
    l.setIcon(getHeaderRendererIcon(modelColumn, l.getFont().getSize()));
    }
    return c;
    }
    }
    private Icon getHeaderRendererIcon(int column, int size) {
    Boolean ascending = (Boolean) ascendingMap.get(new Integer(column));
    if (ascending == null) {
    return null;
    }
    return new Arrow(ascending.booleanValue(), size);
    }
    Arrow我单独测过了,没有问题