以编程方式对JTable进行排序

时间:2009-10-08 17:32:16

标签: java swing

有没有办法以编程方式对JTable进行排序?

我的JTable排序工作(使用setRowSorter),这样当用户按下任何列时,表就会被排序。

我知道,SWingX JXTable可能会工作,但我宁愿不经历麻烦,因为其他一切现在都非常有用,我不知道NetBeans的可视化编辑器处理JXTable等的效果如何。

编辑: 所选答案是指我(现已删除)的声明,即Sun的网页上的答案对我不起作用。这只是我无知造成的环境问题。

2 个答案:

答案 0 :(得分:15)

对我来说很好:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableBasic extends JFrame
{
    public TableBasic()
    {
        String[] columnNames = {"Date", "String", "Long", "Boolean"};
        Object[][] data =
        {
            {new Date(), "A", new Long(1), Boolean.TRUE },
            {new Date(), "B", new Long(2), Boolean.FALSE},
            {new Date(), "C", new Long(9), Boolean.TRUE },
            {new Date(), "D", new Long(4), Boolean.FALSE}
        };

        final JTable table = new JTable(data, columnNames)
        {
            //  Returning the Class of each column will allow different
            //  renderers and editors to be used based on Class

            public Class getColumnClass(int column)
            {
                // Lookup first non-null data on column
                for (int row = 0; row < getRowCount(); row++) 
                {
                    Object o = getValueAt(row, column);

                    if (o != null)
                        return o.getClass();
                }

                return Object.class;
            }
        };
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        table.setAutoCreateRowSorter(true);
        // DefaultRowSorter has the sort() method
        DefaultRowSorter sorter = ((DefaultRowSorter)table.getRowSorter()); 
        ArrayList list = new ArrayList();
        list.add( new RowSorter.SortKey(2, SortOrder.ASCENDING) );
        sorter.setSortKeys(list);
        sorter.sort();

        JScrollPane scrollPane = new JScrollPane( table );
        getContentPane().add( scrollPane );
    }

    public static void main(String[] args)
    {
        TableBasic frame = new TableBasic();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }
}

下次当你的SSCCE无效时发布。

答案 1 :(得分:5)

您还可以通过调用toggleSortOrder()的{​​{1}}上的RowSorter来触发行排序:

JTable

但请注意(引用Javadoc):

  

反转指定列的排序顺序。通常,如果指定的列已经是主要排序列,则会将排序顺序从升序转换为降序(或降序升序)。

虽然速度更快,但如@camickr所示调用table.getRowSorter().toggleSortOrder(columnIndex); (给他+1)是正确的方法(但你需要实现setSortKeys())。