I've a grid ,but I want only 2 columns with option to sort, as I do that?
RowSorter newSorter = new TableRowSorter(table.getModel()); newSorter.setSortKeys(sortKeys); table.setRowSorter(newSorter);
I used this
You virtually had the answer in your hands...
Basically, the setSortKeys method gets called whenever you (or the table) wants to change the sorting (direction or column).
setSortKeys
What you can do is override the TabelRowSorter#setSortKeys method and filter the list as you see fit
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); } }
Now, I'm pretty sure, it wouldn't take much to extend this concept to a configurable level, so you could add "valid" column indices...
You could also go a step further and only allow selected columns to be sorted in a single direction...
but I want only 2 columns with option to sort
Check out the setSortable(...) method of the DefaultRowSorter. You can disable the columns that you don't want to be able to sort.
setSortable(...)
DefaultRowSorter
Copyright © 2021 Jogjafile Inc.
You virtually had the answer in your hands...
Basically, the
setSortKeys
method gets called whenever you (or the table) wants to change the sorting (direction or column).What you can do is override the
TabelRowSorter#setSortKeys
method and filter the list as you see fitNow, I'm pretty sure, it wouldn't take much to extend this concept to a configurable level, so you could add "valid" column indices...
You could also go a step further and only allow selected columns to be sorted in a single direction...