¿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.¿Cómo se puede arrastrar y soltar una fila en una JTable?
Respuesta
Consulte la sección drag and drop del Tutorial de Java. Hay algunos ejemplos sobre cómo implementar esto para JTable
.
Consulte BasicTableUI o la interfaz Transferable.
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) {
}
});
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));
}
}
}
Obtenía excepciones en la transferencia que arreglé cambiando 'localObjectFlavor' a:' private final DataFlavor localObjectFlavor = new DataFlavor (Integer.class, "Integer Row Index"); ' – Koobz
+1 Pero desafortunadamente esto no funcionará para múltiples filas selección. – Stephan
+1 - ¡un par de modificaciones simples y esto funciona perfectamente! – pstanton
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));
}
}
}
- 1. ¿Cómo puedo arrastrar y soltar archivos en una JTable?
- 2. Swing arrastrar y soltar
- 3. Arrastrar y soltar con una imagen
- 4. Mover una fila de JTable
- 5. NSTableView y NSOutlineView de arrastrar y soltar
- 6. ¿Cómo agregar una fila en JTable?
- 7. ¿Cómo puedo arrastrar y soltar archivos en una aplicación?
- 8. ItemsControl Arrastrar y soltar
- 9. ipad arrastrar y soltar
- 10. ¿Arrastrar y soltar polyfill?
- 11. arrastrar y soltar objetos personalizados
- 12. Error en Delphi VCL Arrastrar y soltar?
- 13. Arrastrar y soltar: solo se aceptan carpetas
- 14. Arrastrar y soltar en Treeview
- 15. arrastrar y soltar controles winform
- 16. Trello arrastrar y soltar efecto
- 17. Arrastrar y soltar en MobileSafari?
- 18. Android - arrastrar y soltar - reordenar lista
- 19. desactivar texto arrastrar y soltar
- 20. ¿Cómo eliminar una fila de JTable?
- 21. Java arrastrar y soltar imágenes en una lista
- 22. Seleccionar mediante programación una fila en JTable
- 23. HTML Arrastrar y soltar en dispositivos móviles
- 24. Arrastrar y soltar con Ember.js
- 25. Javascript Arrastrar y soltar cuadrícula
- 26. Arrastrar y soltar usando SendMessage
- 27. UICollectionView efectiva arrastrar y soltar
- 28. Twitter Modalidad Bootstrap: cómo arrastrar y soltar?
- 29. Arrastrar y soltar en MVVM con ScatterView
- 30. UITableView toque y mantenga + arrastrar y soltar
¿Alguna de las siguientes respuestas ayuda? – Ascalonian