客户的要求,鼠标单击排序,并且绘制箭头表示升序降序。画箭头是在刷新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);
}有没有什么方法可以让每次的点击都作刷新
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);
}有没有什么方法可以让每次的点击都作刷新
呵呵,这也是我今天刚刚学到的
{
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();
}
}
}
}
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我单独测过了,没有问题