View Single Post
  #2 (permalink)  
Old 11-06-2007, 06:53 PM
hardwired hardwired is offline
Senior Member
 
Join Date: Jul 2007
Posts: 1,266
hardwired is on a distinguished road
Code:
import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.table.*; public class MainSortTest implements ActionListener { JButton b1,b2; JTable table; JComboBox combo; public MainSortTest() { String[] columnNames = {"First Name","Last Name","Age","Test Scores"}; String[] combodata = {"First Name","Last Name","Age","Test Scores"}; // Smith Dave 12 75 // Johnson Bill 14 72 // Anderson Sara 11 92 // Hoyez Kara 16 83 // Cruz Kyle 13 84 // String[] test = {"","","","",""}; b1=new JButton("0-9/A-Z"); b2=new JButton("9-0/Z-A"); b1.addActionListener(this); b2.addActionListener(this); combo = new JComboBox(combodata); combo.setSelectedIndex(3); combo.setEditable(false); // The combo selectedIndex == table headerColumn index // so there is no need for an ActionListener. // combo.addActionListener(this); Object[][] rowData = { {"Dave", "Smith", new Integer(12), new Integer(75)}, {"Bill", "Johnson", new Integer(14), new Integer(72)}, {"Sara", "Anderson", new Integer(11), new Integer(92)}, {"Kara", "Hoyez", new Integer(16), new Integer(83)}, {"Kyle", "Cruz", new Integer(13), new Integer(84)} }; table = new JTable(new DefaultTableModel(rowData,columnNames)); JFrame f1 = new JFrame(); f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c1 = f1.getContentPane(); c1.add(new JScrollPane(table)); JPanel p1 = new JPanel(); // p1.setSize(400,170); p1.add(combo); p1.add(b1); p1.add(b2); c1.add(p1, "Last"); f1.setSize(400,170); f1.setLocation(200,200); f1.setVisible(true); } public static void main(String[] args) { new MainSortTest(); } public void actionPerformed(ActionEvent event) { int index = combo.getSelectedIndex(); JButton button = (JButton)event.getSource(); boolean ascending = button == b1; if(index < 2) sortStrings(index, ascending); else sortIntegers(index, ascending); } private void sortStrings(int col, boolean ascending) { // Collect the values in the column. TableModel model = table.getModel(); String[] colValues = new String[model.getRowCount()]; int[] rowIndices = new int[model.getRowCount()]; for(int j = 0; j < colValues.length; j++) { colValues[j] = (String)model.getValueAt(j, col); rowIndices[j] = j; } // Sort both arrays. for(int j = 0; j < colValues.length; j++) { String datum = colValues[j]; int replaceIndex = j; for(int k = j+1; k < colValues.length; k++) { int n = colValues[k].compareTo(datum); if( (ascending && n < 0) || (!ascending && n > 0) ) { datum = colValues[k]; replaceIndex = k; } } if(replaceIndex != j) { String temp = colValues[j]; colValues[j] = colValues[replaceIndex]; colValues[replaceIndex] = temp; int tempIndex = rowIndices[j]; rowIndices[j] = rowIndices[replaceIndex]; rowIndices[replaceIndex] = tempIndex; } } sortRows(rowIndices); } private void sortIntegers(int col, boolean ascending) { TableModel model = table.getModel(); Integer[] colValues = new Integer[model.getRowCount()]; int[] rowIndices = new int[model.getRowCount()]; for(int j = 0; j < colValues.length; j++) { colValues[j] = (Integer)model.getValueAt(j, col); rowIndices[j] = j; } // Sort arrays. for(int j = 0; j < colValues.length; j++) { Integer datum = colValues[j]; int replaceIndex = j; for(int k = j+1; k < colValues.length; k++) { int n = colValues[k].compareTo(datum); if( (ascending && n < 0) || (!ascending && n > 0) ) { datum = colValues[k]; replaceIndex = k; } } if(replaceIndex != j) { Integer temp = colValues[j]; colValues[j] = colValues[replaceIndex]; colValues[replaceIndex] = temp; int tempIndex = rowIndices[j]; rowIndices[j] = rowIndices[replaceIndex]; rowIndices[replaceIndex] = tempIndex; } } sortRows(rowIndices); } private void sortRows(int[] indices) { Object[][] data = getSortedData(indices); Object[] colIds = getColumnIdentifiers(); DefaultTableModel model = (DefaultTableModel)table.getModel(); model.setDataVector(data, colIds); model.fireTableStructureChanged(); } private Object[][] getSortedData(int[] indices) { DefaultTableModel model = (DefaultTableModel)table.getModel(); int rows = model.getRowCount(); int cols = model.getColumnCount(); Object[][] data = new Object[rows][cols]; for(int j = 0; j < rows; j++) { for(int k = 0; k < cols; k++) data[j][k] = model.getValueAt(indices[j], k); } return data; } private Object[] getColumnIdentifiers() { TableColumnModel model = table.getColumnModel(); int cols = model.getColumnCount(); Object[] colIds = new Object[cols]; for(int j = 0; j < cols; j++) colIds[j] = model.getColumn(j).getIdentifier(); return colIds; } }
Reply With Quote