A dirty (read: don't, if you are not completely desperate and know exactly what you are doing!) Approach is to connect to the MouseListener installed by uiDelegate and move the sort trigger to the released method. This includes
- a custom MouseListener that delegates all events except clicking on the originally installed and sorting before passing released
- replace original with custom
- update replacement whenever LAF changes (as the original is controlled by ui). This requires subclassing JTableHeader and posting to updateUI
User Listener:
public static class EventHook implements MouseListener { private JTableHeader header; private MouseListener delegate; public EventHook(JTableHeader header) { this.header = header; installHook(); } protected void installHook() { MouseListener[] listeners = header.getMouseListeners(); for (int i = 0; i < listeners.length; i++) { MouseListener l = listeners[i]; if (l.getClass().getName().contains("TableHeaderUI")) { this.delegate = l; listeners[i] = this; } header.removeMouseListener(l); } for (MouseListener l : listeners) { header.addMouseListener(l); } } public void uninstallHook() { MouseListener[] listeners = header.getMouseListeners(); for (int i = 0; i < listeners.length; i++) { MouseListener l = listeners[i]; if (l == this) { listeners[i] = delegate; } header.removeMouseListener(l); } for (MouseListener l : listeners) { header.addMouseListener(l); } } @Override public void mouseReleased(MouseEvent e) {
JTableHeader Subclasses
public static class MyTableHeader extends JTableHeader { private EventHook hook; public MyTableHeader(TableColumnModel model) { super(model); } @Override public void updateUI() { if (hook != null) { hook.uninstallHook(); hook = null; } super.updateUI(); hook = new EventHook(this); } }
Use a JTable subclass and override createDefaultTableHeader or manually set the header:
// either subclass JTable table = new JTable(new AncientSwingTeam()) { @Override protected JTableHeader createDefaultTableHeader() { return new MyTableHeader(getColumnModel()); } }; table.setAutoCreateRowSorter(true);
kleopatra Jan 21 '13 at 13:22 2013-01-21 13:22
source share