usar una setvalueat seleccionada partir ordenar obtener numericamente mostrar los fila desde datos dato como columnas buscar java swing events sorting jtable

java - una - Ordenar JTable cuando se lanza el mouse



setvalueat jtable java (1)

Un enfoque sucio (léase: no lo hagas si no estás absolutamente desesperado y sabes exactamente lo que estás haciendo! ) Es conectarlo al MouseListener instalado por el uiDelegate y mover el desencadenador de clasificación al método liberado. Esto involucra

  • un MouseListener personalizado que delega todos los eventos, excepto el que se hizo clic en los originalmente instalados, y clasifica antes de pasar el publicado
  • reemplace el original con el personalizado
  • actualice el reemplazo cada vez que cambie LAF (porque el original está controlado por el ui). Esto requiere subclassing de JTableHeader y hacer el cableado en updateUI

El oyente personalizado:

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) { // sort before calling super sort(e); delegate.mouseReleased(e); } private void sort(MouseEvent e) { if (!header.isEnabled()) { return; } // do nothing if dragged if (header.getDraggedDistance() != 0) { return; } if (e.getClickCount() % 2 == 1 && SwingUtilities.isLeftMouseButton(e)) { JTable table = header.getTable(); RowSorter sorter; if (table != null && (sorter = table.getRowSorter()) != null) { int columnIndex = header.columnAtPoint(e.getPoint()); if (columnIndex != -1) { columnIndex = table.convertColumnIndexToModel( columnIndex); sorter.toggleSortOrder(columnIndex); } } } } @Override public void mouseClicked(MouseEvent e) { // swallow the clicked - want to trigger sort on released } @Override public void mousePressed(MouseEvent e) { delegate.mousePressed(e); } @Override public void mouseEntered(MouseEvent e) { delegate.mouseEntered(e); } @Override public void mouseExited(MouseEvent e) { delegate.mouseExited(e); } }

El JTableHeader subclasificado

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); } }

Uso, ya sea la subclase JTable y anula createDefaultTableHeader o configura manualmente el encabezado:

// either subclass JTable table = new JTable(new AncientSwingTeam()) { @Override protected JTableHeader createDefaultTableHeader() { return new MyTableHeader(getColumnModel()); } }; table.setAutoCreateRowSorter(true);

Tengo una JTable con la propiedad AutoCreateRowSorter establecida en verdadero. Funciona bien al hacer clic, pero si muevo el mouse durante el clic solo por 1px, la ordenación no aparece, lo cual es incómodo en algunas situaciones. ¿Cómo arreglar esto?

UPD Solo quiero que aparezca la ordenación cuando se suelta el mouse.