Confirmed as a bug on JTable can\'t format given Object as Number when columnClass is Double (bug ID: 7051636). Feel free to vote for it, or if if you have
reall problem is noting to do with previous debate, there is plain vanilla (compare my missing English skills), are you think that that's really Bug, or if I showed ViceVersaView, maybe then somone can be able to comment that chains for JTable + TableModel + Comparator (TableRowSorter for JTable API) in English language, eeeeeerghhh really my bad in this case
import java.awt.*;
import java.awt.event.*;
import java.util.Date;
import javax.swing.*;
import javax.swing.table.*;
public class ViceVersaBugFromTableModelAndComparator {
private String[] columnNames = {"String", "Integer", "Boolean", "Double", "Date"};
private Object[][] data = {
{"aaa", 12, true, .15, new Date()},
{"bbb", 5, false, 100.01, new Date()},
{"CCC", 92, true, 15.2, new Date()},
{"DDD", 0, false, 10.80, new Date()},
{"abc", 5, true, 4.11, new Date()},
{"bae", 31, false, 100.01, new Date()},
{"CAX", 27, true, 2.3, new Date()},
{"AXD", 4, false, 50.00, new Date()},
{"abc", 3, true, 1.5, new Date()},
{"bae", 5, false, 1000, new Date()}, //java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.String
//{"bae", 5, false, 1000.0, new Date()}, //un-comment for correctness
{"CAX", 2, true, 21.7, new Date()},
{"AXD", 2, false, 5.30, new Date()}
};
private TableModel model = new DefaultTableModel(data, columnNames) {
private static final long serialVersionUID = 1L;
@Override
public Class> getColumnClass(int column) {
return String.class;// again java.lang.ClassCastException
//return getValueAt(0, column).getClass(); //un-comment for correctness
}
};
private JTable table = new JTable(model);
private JTableHeader header;
static class TestTableRowSorter extends TableRowSorter {
public TestTableRowSorter(TableModel m) {
super(m);
}
@Override
public void toggleSortOrder(int column) {
}
public void wrapToggleSortOrder(int column) {
super.toggleSortOrder(column);
}
}
private Timer timer = new Timer(400, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("single");
JTable table = header.getTable();
RowSorter sorter;
if (pt != null && table != null && (sorter = table.getRowSorter()) != null) {
int columnIndex = header.columnAtPoint(pt);
if (columnIndex != -1) {
columnIndex = table.convertColumnIndexToModel(columnIndex);
((TestTableRowSorter) sorter).wrapToggleSortOrder(columnIndex);
}
}
}
});
private Point pt;
public JComponent makeUI() {
timer.setRepeats(false);
table.setRowSorter(new TestTableRowSorter(model));
header = table.getTableHeader();
header.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
if (timer.isRunning() && !e.isConsumed() && e.getClickCount() > 1) {
System.out.println("double");
pt = null;
timer.stop();
} else {
pt = e.getPoint();
timer.restart();
}
}
});
JPanel p = new JPanel(new BorderLayout());
p.add(new JScrollPane(table));
return p;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new ViceVersaBugFromTableModelAndComparator().makeUI());
f.setSize(820, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}