Saltar al contenido

¿Cómo arrastro y suelto una fila en una JTable?

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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *