Sorting data in JTable

L

Lukasz

Hello,

From
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html
page, section "Sorting and Otherwise Manipulating Data" I downloaded
the TableSorter.java and implemented it into my test applet:

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class Sort extends Applet implements ActionListener {

JButton push;
JTable tabela;
String[] data = {"First Name", "Last Name"};
String[][] values = new String[145][2];
JFrame ram;
JScrollPane scrollPane;

public void init() {

setLayout(null);
setBackground(new Color(204, 206, 209));

push = new JButton("Push");
push.addActionListener(this);
push.setBounds(10,10, 100, 25);
add(push);
}

public void actionPerformed(ActionEvent e) {
if (e.getSource() == push) {
removeAll();

setLayout(null);
TableSorter sorter = new TableSorter(new Model());
tabela = new JTable(sorter);
sorter.setTableHeader(tabela.getTableHeader());
tabela.setPreferredScrollableViewportSize(new Dimension(450, 250));
scrollPane = new JScrollPane(tabela);
scrollPane.setSize(700,250);
scrollPane.setLocation(200,100);
add(scrollPane);
validate();
repaint();
}
}

class Model extends AbstractTableModel {

String[] data = {"First Name", "Last Name"};
Object[][] values = {
{"mary", "Campione"},
{"alison", "Huml"},
{"Kathy", "Walrath"},
{"Sharon", "Zakhour"},
{"Philip", "Milne"}
};

public int getColumnCount() {
return data.length;
}

public int getRowCount() {
return values.length;
}

public String getColumnName(int col) {
return data[col];
}

public Object getValueAt(int row, int col) {
return values[row][col];
}

public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
}
}


HTML:
<HTML>
<HEAD>
</HEAD>
<BODY>
<APPLET CODE="Sort.class" WIDTH=1000 HEIGHT=1000></APPLET>
</BODY>
</HTML>

When every name or surname from values array starts with big letter,
sorting works fine. When it starts with small letter, this value is not
taken to sorting. I tried in LEXICAL_COMPARATOR in TableSorter.java to
put ignoreCase() and toLowerCase(), but the result was still the same.

Anyone has an idea, what to change in TableSorter.java to have a
properly working sorting?
 
J

John

Lukasz said:
When every name or surname from values array starts with big letter,
sorting works fine. When it starts with small letter, this value is not
taken to sorting. I tried in LEXICAL_COMPARATOR in TableSorter.java to
put ignoreCase() and toLowerCase(), but the result was still the same.

Anyone has an idea, what to change in TableSorter.java to have a
properly working sorting?


The String class cannot understand natural language sorting. You need a
Collator for that. See either of the following:
http://weblogs.java.net/blog/joconner/archive/2006/06/strings_equals.html
http://www.joconner.com/2006/06/28/when-stringequal-just-isnt-enough/

The blog portion that should interest you is the discussion of String's
compareTo vs Collator. I haven't looked at your TableSorter.java class,
but it is most likely comparing with String...not a good thing for
linguistic sorts as shown in the blog entries.

Regards,
John O'Conner
 
R

Richard Wheeldon

Lukasz said:
When every name or surname from values array starts with big letter,
sorting works fine. When it starts with small letter, this value is not
taken to sorting. I tried in LEXICAL_COMPARATOR in TableSorter.java to
put ignoreCase() and toLowerCase(), but the result was still the same.

Anyone has an idea, what to change in TableSorter.java to have a
properly working sorting?

Alter the comparator:

public void setColumnComparator(Class type, Comparator comparator)

Something like this should do it (although I've not tested it):

setColumnComparator(String.class, new Comparator() {
public int compare(Object o1, Object o2) {
return
o1.toString().toLowerCase().compareTo(o2.toString().toLowerCase());
}
}

Richard
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,982
Messages
2,570,190
Members
46,736
Latest member
zacharyharris

Latest Threads

Top