How do I drag and drop a row in a JTable?

前端 未结 5 1544
既然无缘
既然无缘 2020-12-08 01:03

How do you setup a JTable to be able to drag a row to a different index in the table. For example if I have 5 rows and I want to drag the 4th row to the 2nd position?

5条回答
  •  萌比男神i
    2020-12-08 01:21

    The following allows JTable re-ordering of a single dragged row:

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

    Your TableModel should implement the following to allow for re-ordering:

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

    This TransferHandler class handles the drag & drop, and calls reorder() on your TableModel when the gesture is completed.

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

提交回复
热议问题