我无法对列进行排序

时间:2013-11-13 01:32:14

标签: java swing jtable rowsorter

我有一个网格,但我只想要两列可选的排序,就像我那样做?

  RowSorter newSorter = new TableRowSorter(table.getModel());
        newSorter.setSortKeys(sortKeys);
        table.setRowSorter(newSorter);

我用过这个

2 个答案:

答案 0 :(得分:5)

  

但我想只有2列可选择排序

查看setSortable(...)的{​​{1}}方法。您可以禁用不希望排序的列。

答案 1 :(得分:2)

你几乎已经掌握了答案......

基本上,只要您(或表)想要更改排序(方向或列),就会调用setSortKeys方法。

您可以做的是覆盖TabelRowSorter#setSortKeys方法,并根据需要过滤列表

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class RowSorterTest {

    public static void main(String[] args) {
        new RowSorterTest();
    }

    public RowSorterTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                DefaultTableModel model = new DefaultTableModel(new String[]{"B1", "B2", "A1", "A2"}, 0);
                for (int index = 0; index < 100; index++) {
                    model.addRow(new Object[]{rnd(), rnd(), rnd(), rnd()});
                }
                JTable table = new JTable(model);
                RowSorter sorter = new MyRowSorter(model);
                table.setRowSorter(sorter);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MyRowSorter extends TableRowSorter<TableModel> {

        public MyRowSorter(TableModel model) {
            super(model);
        }

        @Override
        public void setSortKeys(List<? extends SortKey> sortKeys) {
            List<SortKey> newKeys = new ArrayList<>(sortKeys.size());
            for (SortKey key : sortKeys) {
                if (key.getColumn() >= 0 && key.getColumn() <= 1) {
                    newKeys.add(key);
                }
            }
            super.setSortKeys(newKeys); 
        }

    }

    protected int rnd() {

        return (int)(Math.random() * 100d);

    }

}

现在,我很确定,将此概念扩展到可配置级别并不需要太多,因此您可以添加“有效”列索引......

您还可以更进一步,只允许选定的列在单一方向排序......

相关问题