问题描述
我想对表进行正确排序,比较正确的类,而不是字符串。 我正在使用tablerowsorter:
tablerowsorter sorter = new tablerowsorter<CustomModelTable>(modelData);
tablaEJ.setRowSorter(sorter);
我在CustomModelTable中重写了getColumnClass方法,所以我根据列的名称获得了正确的类(之所以这样做是因为类型是通过编程定义的):
@Override
public Class getColumnClass(int columnIndex)
{
try {
if (columnIndex < this.getColumnCount()) {
String name = getColumnName(columnIndex); //This just gets the header of the column
name = name.toLowerCase();
switch (name) {
case "int":
case "int[]":
case "núm.":
case "int[][]": return Integer.class; //Or Class.forName("java.lang.Integer");
case "byte":
case "byte[]":
case "byte[][]": return Class.forName("java.lang.Byte");
case "long":
case "long[]":
case "long[][]": return Class.forName("java.lang.Long");
case "float":
case "float[]":
case "float[][]": return Class.forName("java.lang.Float");
case "double":
case "double[]":
case "double[][]": return Class.forName("java.lang.Double");
case "boolean":
case "boolean[]":
case "boolean[][]": return Class.forName("java.lang.Boolean");
case "char":
case "char[]":
case "char[][]": return Class.forName("java.lang.Character");
case "string":
case "string[]":
case "string[][]": return Class.forName("java.lang.String");
default: return Class.forName("java.lang.String");
}
}
} catch (Exception e){
}
return null;
}
以下是屏幕截图: Table wrongly sorted
最奇怪的是我打印了这些类型:
for (int i = 0; i < tablaEJ.getModel().getColumnCount(); i++) {
System.out.println(tablaEJ.getModel().getColumnClass(i));
}
class java.lang.Integer
class java.lang.Integer
class java.lang.Integer
class java.lang.Integer
老实说,我不知道我在做什么错。
解决方法
“安全”的方法是声明哪些列索引是数字:
public static class CustomTableModel extends DefaultTableModel {
private final List<Integer> columnIndicesWithNumbers = Arrays.asList(0);
@Override
public Class<?> getColumnClass(int columnIndex) {
if (columnIndicesWithNumbers.contains(columnIndex))
return Double.class;
return super.getColumnClass(columnIndex);
}
}
这是一个测试自己的完整示例:
public class SorterTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
DefaultTableModel dm = new CustomTableModel();
dm.addColumn("Integers");
dm.addColumn("Strings");
//@formatter:off
Object[][] data = {
{ 1,"Something" },{ 102,"Something Else" },{ 55,{ 66,{ 1000,{ 1524,{ 5801,{ -55,};
//@formatter:on
for (Object[] row : data) {
dm.addRow(row);
}
JTable table = new JTable(dm);
table.setAutoCreateRowSorter(true);
JOptionPane.showMessageDialog(null,new JScrollPane(table));
});
}
public static class CustomTableModel extends DefaultTableModel {
private final List<Integer> columnIndicesWithNumbers = Arrays.asList(0);
@Override
public Class<?> getColumnClass(int columnIndex) {
if (columnIndicesWithNumbers.contains(columnIndex))
return Double.class;
return super.getColumnClass(columnIndex);
}
}
}
预览:
在评论部分中进行澄清后:
您可以使用@Override
getValueAt
方法来返回整数而不是字符串。
完整示例:
public class SorterTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
DefaultTableModel dm = new CustomTableModel();
dm.addColumn("Integers");
dm.addColumn("Strings");
//@formatter:off
Object[][] data = {
{ "1",{ "102",{ "55",{ "66",{ "1000",{ "1524",{ "5801",{ "-55",new JScrollPane(table));
});
}
public static class CustomTableModel extends DefaultTableModel {
private final List<Integer> columnIndicesWithNumbers = Arrays.asList(0);
@Override
public Object getValueAt(int row,int column) {
Object value = super.getValueAt(row,column);
if (columnIndicesWithNumbers.contains(column)) {
return Double.parseDouble(String.valueOf(value));
}
return value;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
if (columnIndicesWithNumbers.contains(columnIndex))
return Double.class;
return super.getColumnClass(columnIndex);
}
}
}
,
我认为您不应该强制转换类型。 定义列时,应在设置任何内容之前实例化列的类型。