varias usar una setvalueat seleccionar seleccionada ordenar obtener numericamente los filas fila desde datos dato como columnas codigo buscar java swing drag-and-drop jtable mouse

java - usar - ¿Cómo arrastro y coloco una fila en una JTable?



seleccionar varias filas en un jtable en java (5)

¿Cómo configura una JTable para poder arrastrar una fila a un índice diferente en la tabla? Por ejemplo, si tengo 5 filas y quiero arrastrar la 4ª fila a la 2ª posició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 arrastrar y soltar, 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)); } } }


Solo para los registros y reordenamiento de múltiples filas:

usar en alguna parte ...

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, la modifiqué para que coincida con las necesidades de DnD de múltiples filas. Todo lo que hice fue usar la primera fila seleccionada, luego calcular las filas sobre el lugar de caída. 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)); } } }


tal vez algo Me gusta esto:

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) { } });


Consulte la sección de arrastrar y soltar del tutorial de Java. Hay algunos ejemplos sobre cómo implementar esto para JTable .