2

我有一个网格,但我只想要 2 列可以选择排序,因为我这样做?

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

我用这个

4

2 回答 2

5

但我只想要 2 列带有排序选项的列

看看的setSortable(...)方法DefaultRowSorter。您可以禁用不想排序的列。

于 2013-11-13T03:02:10.107 回答
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);

    }

}

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

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

于 2013-11-13T02:31:08.530 回答