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;
}
}