Table Sorting based on Column Selection

Dear All,I am using an AbstractTableModel. I would like to implement the sorting based on Column selection. Could anyone help me in this please.Thanks in advance,RegardsIrfaan
[210 byte] By [Irfan_dcrtia] at [2007-11-27 9:52:09]
# 1
table.setAutoCreateRowSorter(true);orcreate your own sorter
Yannixa at 2007-7-13 0:21:21 > top of Java-index,Desktop,Core GUI APIs...
# 2
Yeah, but this method is not available for AbstractTableModel.
Irfan_dcrtia at 2007-7-13 0:21:21 > top of Java-index,Desktop,Core GUI APIs...
# 3

check this

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import javax.swing.UIManager;

import javax.swing.table.AbstractTableModel;

import javax.swing.table.TableCellRenderer;

import javax.swing.table.TableColumnModel;

import java.awt.Component;

import java.awt.GridLayout;

import java.awt.Insets;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.util.Hashtable;

public class TableSorter extends JPanel

{

private boolean DEBUG= false;

private Object[]columnNames = { "First Name", "Last Name", "Sport", "# of Years",

"Vegetarian"};

private Object[][] data= { { "Mary", "Campione", "Snowboarding", 1, 2 },

{ "Alison", "Huml", "Rowing", 3, 4 }, { "Kathy", "Walrath", "Knitting", 5, 9 },

{ "Sharon", "Zakhour", "Speed reading", 6, 10 }, { "Philip", "Milne", "Pool", 7, 11 },

{ "Isaac", "Rabinovitch", "Nitpicking", 8, 12 }, };

private SortFilterModelm_modSortFilterModel;

private TableColumnModelm_modColumnModel;

private TableHeaderRenderer m_btnSorterRenderer;

protected booleanm_bAbCOC= true;

JTable table= new JTable();

public TableSorter()

{

super(new GridLayout(1, 0));

m_modSortFilterModel = new SortFilterModel();

m_modSortFilterModel.addMouseListener(table);

table.setModel(m_modSortFilterModel);

m_btnSorterRenderer = new TableHeaderRenderer();

m_modColumnModel = table.getColumnModel();

for (int i = 0; i < columnNames.length; i++)

{

m_modColumnModel.getColumn(i).setHeaderRenderer(m_btnSorterRenderer);

}

JScrollPane scrollPane = new JScrollPane(table);

add(scrollPane);

}

private class SortFilterModel extends AbstractTableModel

{

int[]indexes;

ATSTableSorter sorter;

public String[] tableHeadersArray;

boolean isAscent = true;

public void addMouseListener(final JTable table)

{

table.getTableHeader().addMouseListener(new MouseAdapter()

{

public void mouseClicked(MouseEvent event)

{

int tableColumn = table.columnAtPoint(event.getPoint());

m_btnSorterRenderer.setPressedColumn(tableColumn);

m_btnSorterRenderer.setSelectedColumn(tableColumn);

if (TableHeaderRenderer.DOWN == m_btnSorterRenderer.getState(tableColumn))

{

isAscent = true;

}

else

{

isAscent = false;

}

// translate to table model index and sort

int modelColumn = table.convertColumnIndexToModel(tableColumn);

sortByColumn(modelColumn, isAscent);

}

});

}

public Object getValueAt(int row, int col)

{

int rowIndex = row;

if (indexes != null)

{

rowIndex = indexes[row];

}

return data[rowIndex][col];

}

public void setValueAt(Object value, int row, int col)

{

int rowIndex = row;

if (indexes != null)

{

rowIndex = indexes[row];

}

super.setValueAt(value, rowIndex, col);

}

public void sortByColumn(int column, boolean isAscent)

{

if (sorter == null)

{

sorter = new ATSTableSorter(this);

}

sorter.sort(column, isAscent);

fireTableDataChanged();

}

public int[] getIndexes()

{

int n = getRowCount();

if (indexes != null)

{

if (indexes.length == n)

{

return indexes;

}

}

indexes = new int[n];

for (int i = 0; i < n; i++)

{

indexes[i] = i;

}

return indexes;

}

public int getRowCount()

{

return data.length;

}

public String getColumnName(int c)

{

return columnNames[c].toString();

}

public int getColumnCount()

{

return columnNames.length;

}

public Class getColumnClass(int col)

{

switch (col)

{

case 0:

return String.class;

case 1:

return String.class;

case 2:

return String.class;

case 3:

return Integer.class;

case 4:

return Integer.class;

default:

return Object.class;

}

}

}

class ATSTableSorter

{

SortFilterModel model;

public ATSTableSorter(SortFilterModel model)

{

this.model = model;

}

public void sort(int column, boolean isAscent)

{

int n = model.getRowCount();

int[] indexes = model.getIndexes();

for (int i = 0; i < n - 1; i++)

{

int k = i;

for (int j = i + 1; j < n; j++)

{

if (isAscent)

{

if (compare(column, j, k) < 0)

{

k = j;

}

}

else

{

if (compare(column, j, k) > 0)

{

k = j;

}

}

}

int tmp = indexes[i];

indexes[i] = indexes[k];

indexes[k] = tmp;

}

}

public int compare(int column, int row1, int row2)

{

Object o1 = model.getValueAt(row1, column);

Object o2 = model.getValueAt(row2, column);

if (o1 == null && o2 == null)

{

return 0;

}

else if (o1 == null)

{

return -1;

}

else if (o2 == null)

{

return 1;

}

else

{

Class type = model.getColumnClass(column);

if (type.getSuperclass() == Number.class)

{

return compare((Number) o1, (Number) o2);

}

else if (type == String.class)

{

return ((String) o1).compareTo((String) o2);

}

else

{

return ((String) o1).compareTo((String) o2);

}

}

}

public int compare(Number o1, Number o2)

{

double n1 = o1.doubleValue();

double n2 = o2.doubleValue();

if (n1 < n2)

{

return -1;

}

else if (n1 > n2)

{

return 1;

}

else

{

return 0;

}

}

}

class TableHeaderRenderer extends JButton implements TableCellRenderer

{

public static final int NONE = 0;

public static final int DOWN = 1;

public static final int UP= 2;

int pushedColumn;

Hashtablestate;

public TableHeaderRenderer()

{

pushedColumn = -1;

state = new Hashtable();

setMargin(new Insets(0, 0, 0, 0));

setHorizontalTextPosition(LEFT);

}

public Component getTableCellRendererComponent(JTable table, Object value,

boolean isSelected, boolean hasFocus,

int row, int column)

{

setText((value == null) ? "" : value.toString());

setBorder(UIManager.getBorder("TableHeader.cellBorder"));

boolean isPressed = (column == pushedColumn);

getModel().setPressed(isPressed);

getModel().setArmed(isPressed);

return this;

}

public void setPressedColumn(int col)

{

pushedColumn = col;

}

public void setSelectedColumn(int col)

{

if (col < 0)

return;

Integer value = null;

Object obj = state.get(new Integer(col));

if (obj == null)

{

value = new Integer(DOWN);

}

else

{

if (((Integer) obj).intValue() == DOWN)

{

value = new Integer(UP);

}

else

{

value = new Integer(DOWN);

}

}

state.clear();

state.put(new Integer(col), value);

}

public int getState(int col)

{

int retValue;

Object obj = state.get(new Integer(col));

if (obj == null)

{

retValue = NONE;

}

else

{

if (((Integer) obj).intValue() == DOWN)

{

retValue = DOWN;

}

else

{

retValue = UP;

}

}

return retValue;

}

}

private static void createAndShowGUI()

{

JFrame frame = new JFrame("TableDemo");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

TableSorter newContentPane = new TableSorter();

newContentPane.setOpaque(true); // content panes must be opaque

frame.setContentPane(newContentPane);

frame.pack();

frame.setVisible(true);

}

public static void main(String[] args)

{

javax.swing.SwingUtilities.invokeLater(new Runnable()

{

public void run()

{

createAndShowGUI();

}

});

}

}

dayanandabva at 2007-7-13 0:21:21 > top of Java-index,Desktop,Core GUI APIs...
# 4

> I am using an AbstractTableModel.

No you aren't. You are using a class that extends AbstractTableModel and you have implemented some methods. The question is why are you doing this? The DefaultTableModel will work in most situations.

Read the JTable API and you will find a link to the Swing tutorial on "How to Use Table", which shows you how to use ANY TableModel for sorting purposes.

camickra at 2007-7-13 0:21:21 > top of Java-index,Desktop,Core GUI APIs...