JAVA实现表格排序的方法

来源:互联网 发布:对付远光灯的神器淘宝 编辑:程序博客网 时间:2024/04/29 00:28

/**
   @version 1.00 2001-07-18
   @author Cay Horstmann
*/

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

/**
   This program demonstrates how to sort a table column.
   Double-click on a table columm to sort it.
*/
public class TableSortTest

   public static void main(String[] args)
   { 
      JFrame frame = new TableSortFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.show();
   }
}

/**
   This frame contains a table of planet data.
*/
class TableSortFrame extends JFrame

   public TableSortFrame()
   { 
      setTitle("TableSortTest");
      setSize(WIDTH, HEIGHT);

      // set up table model and interpose sorter

      DefaultTableModel model
         = new DefaultTableModel(cells, columnNames);
      final SortFilterModel sorter = new SortFilterModel(model);

      // show table

      final JTable table = new JTable(sorter);
      getContentPane().add(new JScrollPane(table),
         BorderLayout.CENTER);

      // set up double click handler for column headers

      table.getTableHeader().addMouseListener(new
         MouseAdapter()
         { 
            public void mouseClicked(MouseEvent event)
            { 
               // check for double click
               if (event.getClickCount() < 2) return;

               // find column of click and
               int tableColumn
                  = table.columnAtPoint(event.getPoint());

               // translate to table model index and sort
               int modelColumn
                  = table.convertColumnIndexToModel(tableColumn);
               sorter.sort(modelColumn);
            }
         });
   }

   private Object[][] cells =
   { 
      {
         "Mercury", new Double(2440),  new Integer(0),
         Boolean.FALSE, Color.yellow
      },
        
      {
         "Venus", new Double(6052), new Integer(0),
         Boolean.FALSE, Color.yellow
      },
      {
         "Earth", new Double(6378), new Integer(1),
         Boolean.FALSE, Color.blue
      },
      {
         "Mars", new Double(3397), new Integer(2),
         Boolean.FALSE, Color.red
      },
      {
         "Jupiter", new Double(71492), new Integer(16),
         Boolean.TRUE, Color.orange
      },
      {
         "Saturn", new Double(60268), new Integer(18),
         Boolean.TRUE, Color.orange
      },
      {
         "Uranus", new Double(25559), new Integer(17),
         Boolean.TRUE, Color.blue
      },
      {
         "Neptune", new Double(24766), new Integer(8),
         Boolean.TRUE, Color.blue
      },
      {
         "Pluto", new Double(1137), new Integer(1),
         Boolean.FALSE, Color.black
      }
   };

   private String[] columnNames =
   { 
      "Planet", "Radius", "Moons", "Gaseous", "Color"
   };

   private static final int WIDTH = 400;
   private static final int HEIGHT = 200;
}

/**
   This table model takes an existing table model and produces
   a new model that sorts the rows so that the entries in
   a particular column are sorted.
*/
class SortFilterModel extends AbstractTableModel
{
   /**
      Constructs a sort filter model.
      @param m the table model to filter
   */
   public SortFilterModel(TableModel m)
   { 
      model = m;
      rows = new Row[model.getRowCount()];
      for (int i = 0; i < rows.length; i++)
      { 
         rows[i] = new Row();
         rows[i].index = i;
      }
   }

   /**
      Sorts the rows.
      @param c the column that should become sorted
   */
   public void sort(int c)
   { 
      sortColumn = c;
      Arrays.sort(rows);
      fireTableDataChanged();
   }

   // Compute the moved row for the three methods that access
   // model elements

   public Object getValueAt(int r, int c)
   { 
      return model.getValueAt(rows[r].index, c);
   }

   public boolean isCellEditable(int r, int c)
   { 
      return model.isCellEditable(rows[r].index, c);
   }

   public void setValueAt(Object aValue, int r, int c)
   { 
      model.setValueAt(aValue, rows[r].index, c);
   }

   // delegate all remaining methods to the model

   public int getRowCount()
   { 
      return model.getRowCount();
   }

   public int getColumnCount()
   { 
      return model.getColumnCount();
   }

   public String getColumnName(int c)
   { 
      return model.getColumnName(c);
   }

   public Class getColumnClass(int c)
   { 
      return model.getColumnClass(c);
   }

   /**
      This inner class holds the index of the model row
      Rows are compared by looking at the model row entries
      in the sort column.
   */
   private class Row implements Comparable
   { 
      public int index;
      public int compareTo(Object other)
      { 
         Row otherRow = (Row)other;
         Object a = model.getValueAt(index, sortColumn);
         Object b = model.getValueAt(otherRow.index, sortColumn);
         if (a instanceof Comparable)
            return ((Comparable)a).compareTo(b);
         else
            return a.toString().compareTo(b.toString());

            //            return index - otherRow.index;
      }
   }

   private TableModel model;
   private int sortColumn;
   private Row[] rows;
}

 

原创粉丝点击