Nuestros programadores estrellas han agotado sus reservas de café, en su búsqueda diariamente por la respuesta, hasta que Lucía encontró el arreglo en Beanstalk y ahora la comparte aquí.
Solución:
Lo siguiente permite el reordenamiento de JTable de una sola fila arrastrada:
table.setDragEnabled(true);
table.setDropMode(DropMode.INSERT_ROWS);
table.setTransferHandler(new TableRowTransferHandler(table));
Su TableModel debe implementar lo siguiente para permitir el reordenamiento:
public interface Reorderable
public void reorder(int fromIndex, int toIndex);
Esta clase TransferHandler maneja el arrastrar y soltar, y llama a reorder() en tu TableModel cuando se completa el gesto.
/**
* Handles drag & drop row reordering
*/
public class TableRowTransferHandler extends TransferHandler
private final DataFlavor localObjectFlavor = new ActivationDataFlavor(Integer.class, "application/x-java-Integer;class=java.lang.Integer", "Integer Row Index");
private JTable table = null;
public TableRowTransferHandler(JTable table)
this.table = table;
@Override
protected Transferable createTransferable(JComponent c)
assert (c == table);
return new DataHandler(new Integer(table.getSelectedRow()), localObjectFlavor.getMimeType());
@Override
public boolean canImport(TransferHandler.TransferSupport info)
boolean b = info.getComponent() == table && info.isDrop() && info.isDataFlavorSupported(localObjectFlavor);
table.setCursor(b ? DragSource.DefaultMoveDrop : DragSource.DefaultMoveNoDrop);
return b;
@Override
public int getSourceActions(JComponent c)
return TransferHandler.COPY_OR_MOVE;
@Override
public boolean importData(TransferHandler.TransferSupport info) index > max)
index = max;
target.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
try
Integer rowFrom = (Integer) info.getTransferable().getTransferData(localObjectFlavor);
if (rowFrom != -1 && rowFrom != index)
((Reorderable)table.getModel()).reorder(rowFrom, index);
if (index > rowFrom)
index--;
target.getSelectionModel().addSelectionInterval(index, index);
return true;
catch (Exception e)
e.printStackTrace();
return false;
@Override
protected void exportDone(JComponent c, Transferable t, int act) (act == TransferHandler.NONE))
table.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
Consulte la sección de arrastrar y soltar del Tutorial de Java. Hay algunos ejemplos de cómo implementar esto para JTable
.
Valoraciones y comentarios
Te invitamos a añadir valor a nuestra información contribuyendo tu experiencia en las reseñas.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)