Gig*_*0rt 6 java double swing jtable tablerowsorter
我发现了很多与此相关的问题,但我没有找到解决我问题的简单方法.
我找不到一种方法来使我的JTable排序正确的Double值.
我扩展AbstractTableModel以接收一个Class数组并返回每列的正确类型:
class TableModelMod extends AbstractTableModel{
private ArrayList data;
private String [] headers;
private Class [] types;
TableModelMod(String [] heads, ArrayList datas, Class [] classes){
headers = heads;
data = datas;
types = classes;
}
...
@Override public Class getColumnClass(int c){
if (c > types.length - 1)
return null;
else
return types[c];
}
...
Run Code Online (Sandbox Code Playgroud)
然后在我的自定义JTable构造函数中:
TableRowSorter<TableModelMod> sorter = new TableRowSorter<TableModelMod>((TableModelMod)getModel());
Run Code Online (Sandbox Code Playgroud)
但是在添加行时我遇到了这个错误:
java.lang.IllegalArgumentException: Cannot format given Object as a Number
Run Code Online (Sandbox Code Playgroud)
它在DecimalFormat.format(Object number, StringBuffer toAppendTo, FieldPosition pos)
接受大多数数字类型但是Double的方法中失败.
如果我为Double列使用另一个类,我没有错误,但仍然排序不能按预期工作.我试过不同的数字类,但似乎没有正确排序双打:
@Override public Class getColumnClass(int c){
if (c > types.length - 1)
return null;
else if (types[c] == Double.class)
return Number.class;
else
return types[c];
}
Run Code Online (Sandbox Code Playgroud)
我不确定我需要的是实现自定义RowSorter,自定义CellRenderer还是两者.
有人可以指导我如何解决这个更简单的方法吗?
非常感谢和最诚挚的问候.
编辑:已解决
告诉问题在哪里是非常尴尬的.
包含Object []行的ArrayList是使用getString(int)而不是getObject(int)或getDouble(int)从数据库ResultSet填充的,因此渲染器不能将该值用作Double.奇怪的是,它没有使用Integer或Number作为列类提供异常,但它仍然被排序为String.我在错误的类中寻找问题,因为我确信我的ArrayList只包含Objects.
非常感谢你的例子,看着他们我注意到我的双打实际上是字符串然后我可以找到转换发生的地方.
看看这段代码.它对双重值进行排序.
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class RowSorterDemo {
public static void main(String args[]) {
JFrame frame = new JFrame("Sort Table Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Object rows[][] = { { "J", 23.1 }, { "R", 21.1, }, { "E", 21.2, }, { "B", 27.1, }, { "A", 25.2, },
{ "S", 22.9, }, };
String columns[] = { "Name", "Age" };
TableModel model = new DefaultTableModel(rows, columns) {
public Class getColumnClass(int column) {
Class returnValue;
if ((column >= 0) && (column < getColumnCount())) {
returnValue = getValueAt(0, column).getClass();
} else {
returnValue = Object.class;
}
return returnValue;
}
};
JTable table = new JTable(model);
RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
table.setRowSorter(sorter);
JScrollPane pane = new JScrollPane(table);
frame.add(pane, BorderLayout.CENTER);
frame.setSize(300, 150);
frame.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
我稍微修改了这个链接给出的源,因此它需要双倍的值.
这段代码可能是你的SSCCE,你可以证明你对这段代码的问题,没有你发布的代码剪断
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableTest2 {
public void initGUI() {
String[] columnNames = {"numbers","double", "text"};
Object[][] data = {{1, 0.81, "A"}, {10, 5.268752005, "B"}, {7, 100.0,"C"},{6, 52.879999, "A"},
{4, 62.50, "B"}, {2, 854.9999, "C"},{11, 19.01, "A"}, {100, 0.0009, "B"}, {20, 100.09, "C"}};
JTable table = new JTable(new DefaultTableModel(data, columnNames) {
private static final long serialVersionUID = 1L;
@Override
public java.lang.Class<?> getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
});
table.setAutoCreateRowSorter(true);
table.getRowSorter().setSortKeys(Arrays.asList(new RowSorter.SortKey(0, SortOrder.ASCENDING)));
JFrame frame = new JFrame("LFIXimate");
frame.setResizable(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TableTest2().initGUI();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)