Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / August 2006

Tip: Looking for answers? Try searching our database.

Sorting data in JTable

Thread view: 
Lukasz - 16 Aug 2006 13:12 GMT
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?
John - 16 Aug 2006 20:07 GMT
> 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
[quoted text clipped - 3 lines]
>  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
Richard Wheeldon - 28 Aug 2006 19:47 GMT
> 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
[quoted text clipped - 3 lines]
>  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


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.