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.