2009-03-12 11 views

Respuesta

4

Consulte la sección drag and drop del Tutorial de Java. Hay algunos ejemplos sobre cómo implementar esto para JTable.

0

quizás sth. de esta manera:

table.addMouseMotionListener(new MouseMotionListener() { 
    public void mouseDragged(MouseEvent e) { 
     e.consume(); 
     JComponent c = (JComponent) e.getSource(); 
     TransferHandler handler = c.getTransferHandler(); 
     handler.exportAsDrag(c, e, TransferHandler.MOVE); 
    } 

    public void mouseMoved(MouseEvent e) { 
    } 
}); 
55

El siguiente permite JTable reordenación de una sola fila arrastrado:

table.setDragEnabled(true); 
    table.setDropMode(DropMode.INSERT_ROWS); 
    table.setTransferHandler(new TableRowTransferHandler(table)); 

Su TableModel deben aplicar el siguiente para permitir el reordenamiento:

public interface Reorderable { 
    public void reorder(int fromIndex, int toIndex); 
} 

Esta clase TransferHandler maneja la operación de arrastrar &, y llama a reordenar() en su 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) { 
     JTable target = (JTable) info.getComponent(); 
     JTable.DropLocation dl = (JTable.DropLocation) info.getDropLocation(); 
     int index = dl.getRow(); 
     int max = table.getModel().getRowCount(); 
     if (index < 0 || 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) { 
     if ((act == TransferHandler.MOVE) || (act == TransferHandler.NONE)) { 
     table.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
     } 
    } 

} 
+1

Obtenía excepciones en la transferencia que arreglé cambiando 'localObjectFlavor' a:' private final DataFlavor localObjectFlavor = new DataFlavor (Integer.class, "Integer Row Index"); ' – Koobz

+0

+1 Pero desafortunadamente esto no funcionará para múltiples filas selección. – Stephan

+0

+1 - ¡un par de modificaciones simples y esto funciona perfectamente! – pstanton

0

Sólo por los registros y múltiples filas de reordenación:

uso en algún lugar ....

JTable table = t_objects; 
    table.setDragEnabled(true); 
    table.setDropMode(DropMode.INSERT_ROWS); 
    table.setTransferHandler(new TableRowTransferHandler(table)); 

Esta es la clase principal en la respuesta anterior, lo que modifica para que coincida las necesidades de múltiples filas DnD. Todo lo que hice fue utilizar la primera fila seleccionada, luego calcular las filas sobre el lugar de colocación. Se eliminaron los artículos seleccionados y se los mantuvo en una lista de objetos (objeto de matriz de fila). luego insértelos nuevamente a la fila calculada. y finalmente seleccione las filas eliminadas/arrastradas para completar el proceso.

public class TableRowTransferHandler extends TransferHandler { 

    private final DataFlavor localObjectFlavor = new DataFlavor(Integer.class, "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) { 
     JTable target = (JTable) info.getComponent(); 
     JTable.DropLocation dl = (JTable.DropLocation) info.getDropLocation(); 
     int index = dl.getRow(); 
     int max = table.getModel().getRowCount(); 
     if (index < 0 || index > max) { 
      index = max; 
     } 
     target.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 

     try { 
      Integer rowFrom = (Integer) info.getTransferable().getTransferData(localObjectFlavor); 
      if (rowFrom != -1 && rowFrom != index) { 

       int[] rows = table.getSelectedRows(); 
       int dist = 0; 
       for (int row : rows) { 
        if (index > row) { 
         dist++; 
        } 
       } 
       index -= dist; 

       //**TableUtil** is a simple class that just copy, remove and select rows. 

       ArrayList<Object> list = TableUtil.getSelectedList(table); 
       TableUtil.removeSelected(table); 
       ArrayList<Integer> sels = new ArrayList<Integer>(); 
       for (Object obj : list) { 
        sels.add(index); 
        TableUtil.addRowAt(table, obj, index++); 
       } 
       TableUtil.selectMultipleRow(table, sels); 


       return true; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return false; 
    } 

    @Override 
    protected void exportDone(JComponent c, Transferable t, int act) { 
     if (act == TransferHandler.MOVE) { 
      table.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
     } 
    } 
}