我有一个网格,但我只想要 2 列和排序选项,因为我这样做?
RowSorter newSorter = new TableRowSorter(table.getModel());
newSorter.setSortKeys(sortKeys);
table.setRowSorter(newSorter);
我用了这个
但我只想要 2 列和排序选项
查看DefaultRowSorter
的setSortable(...)
方法。您可以禁用不希望排序的列。
你几乎掌握了答案......
基本上,只要您(或表)想要更改排序(方向或列),就会调用 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);
}
}
现在,我很确定,将这个概念扩展到可配置的级别并不需要太多,所以你可以添加"有效"的列索引......
您还可以更进一步,只允许在单个方向上对选定的列进行排序......