Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 整数值的JTable排序问题_Java_Swing_User Interface_Sorting_Jtable - Fatal编程技术网

Java 整数值的JTable排序问题

Java 整数值的JTable排序问题,java,swing,user-interface,sorting,jtable,Java,Swing,User Interface,Sorting,Jtable,目前我有一个JTable,它使用RowSorter,但是当我单击要排序的标题时,它会以奇怪的顺序显示行 一, 十, 十一, 二, 二十 二十一, 三, 三十 但是,当我选择某一行时,比如第5行,它会更改标记为5的行。有什么原因可以解释为什么会发生这种情况以及我如何修复它吗?您将行内容视为文本。您的排序顺序是字母顺序,而不是数字顺序。如果您将内容视为数字,它应该会自动计算出来。若要扩展@aaamos的答案,请验证您的表格模型是否从getColumnClass()返回Number.class

目前我有一个
JTable
,它使用
RowSorter
,但是当我单击要排序的标题时,它会以奇怪的顺序显示行

  • 一,
  • 十,
  • 十一,
  • 二,
  • 二十
  • 二十一,
  • 三,
  • 三十

但是,当我选择某一行时,比如第5行,它会更改标记为5的行。有什么原因可以解释为什么会发生这种情况以及我如何修复它吗?

您将行内容视为文本。您的排序顺序是字母顺序,而不是数字顺序。如果您将内容视为数字,它应该会自动计算出来。

若要扩展@aaamos的答案,请验证您的
表格模型是否从
getColumnClass()
返回
Number.class
(或合适的子类)。这里有一个相关示例。

您可以通过显式设置JTable的模型来设置其列类型,如下例所示

setModel(new DefaultTableModel(new Object[0][], new String[] {
                "SELECT", "WHERE", "FIELD", "TYPE" }) {
            Class[] types = { Boolean.class, Boolean.class, String.class,
                    String.class };
            boolean[] canEdit = { true, false, false, false };

            @Override
            public Class getColumnClass(int columnIndex) {
                return this.types[columnIndex];
            }

            public boolean isCellEditable(int columnIndex) {
                return this.canEdit[columnIndex];
            }
        });
给出如下列类(这里列1和列2是布尔值,其余为字符串)

 Class[] types = { Boolean.class, Boolean.class, String.class,String.class };

为了满足您的要求,您只需设置RowSorter在对指定列进行排序时使用的比较器。代码如下所示:

table.setAutoCreateRowSorter(true);
TableRowSorter<DefaultTableModel> rowSorter = (TableRowSorter<DefaultTableModel>)table.getRowSorter();
rowSorter.setComparator(5, new Comparator<String>() {

        @Override
        public int compare(String o1, String o2)
        {
            return Integer.parseInt(o1) - Integer.parseInt(o2);
        }

    });
table.setAutoCreateRowSorter(真);
TableRowSorter rowSorter=(TableRowSorter)table.getRowSorter();
行分类器。设置比较器(5,新比较器(){
@凌驾
公共整数比较(字符串o1、字符串o2)
{
返回Integer.parseInt(o1)-Integer.parseInt(o2);
}
});

您必须将以下代码添加到实际代码中,该代码不会将列排序为整数

构建JTable的实际代码是:

DefaultTableModel modeloT = new DefaultTableModel(); 
// But Sorts the column of numbers in wrong way. 1,11,2,25,......
解决方案:

DefaultTableModel modeloT = new DefaultTableModel() {

// Defining the type of column on your JTable. I wish sort my second column as a numeric (1,2,11), not String (1,11,2). For that I defined the second class as Integer.
Class[] types = { String.class, Integer.class, String.class };
boolean[] canEdit = new boolean [] {
    false, false, false
};

    // You must add this Override in order to works sorting by numeric.
@Override
public Class getColumnClass(int columnIndex) {
        return this.types[columnIndex];
        }       

     // This override is just for avoid editing the content of my JTable. 
@Override
public boolean isCellEditable(int row, int column) {
        return false;
        }
};

我也在努力实现你想要做的事情,我自己也在努力理解如何做到。我实现“正确”排序的方式如下:

DefaultTableModel model = new DefaultTableModel(row, col){
    @Overrride
     public Class getColumnClass(int c) {
         return getValueAt(0, c).getClass();
     }
});

“当我选择某一行,比如第5行时,它会更改标记为5的行”是什么意思?显示的行是否发生变化,或者当您试图获取所选行时,您获得的是另一行?调整
表格模型更好,我可以看出这种方法的表面吸引力,但@Robin是正确的:模型应包含数字类型。+1用于调整模型;数字类型也是可能的。