2009-04-02 8 views

Respuesta

11

Simplemente use la clase DropTarget para recibir eventos de soltar. Se puede distinguir entre gotas en la tabla actual (columnas disponibles/filas) y en el panel de desplazamiento (por ejemplo, a añadir nuevas filas)

import java.awt.BorderLayout; 
import java.awt.Point; 
import java.awt.dnd.DropTarget; 
import java.awt.dnd.DropTargetDropEvent; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 


public class SwingTest extends JFrame{ 
    private JTable table = new JTable(); 
    private JScrollPane scroll = new JScrollPane(table); 
    private DefaultTableModel tm = new DefaultTableModel(new String[]{"a","b","c"},2); 

    public SwingTest() { 
     table.setModel(tm); 
     table.setDropTarget(new DropTarget(){ 
      @Override 
      public synchronized void drop(DropTargetDropEvent dtde) { 
       Point point = dtde.getLocation(); 
       int column = table.columnAtPoint(point); 
       int row = table.rowAtPoint(point); 
       // handle drop inside current table 
       super.drop(dtde); 
      } 
     }); 
     scroll.setDropTarget(new DropTarget(){ 
      @Override 
      public synchronized void drop(DropTargetDropEvent dtde) { 
       // handle drop outside current table (e.g. add row) 
       super.drop(dtde); 
      } 
     }); 
     this.getContentPane().setLayout(new BorderLayout()); 
     this.getContentPane().add(scroll); 
     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     this.setSize(800,600); 
     this.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new SwingTest(); 
    } 
} 
+0

Este código no hace nada excepto mostrar la tabla. Al arrastrarlo, no pasa nada – Yossale

7

@yossale Es necesario añadir el siguiente código al método:

public synchronized void drop(DropTargetDropEvent dtde)  
{ 
       dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); 
       Transferable t = dtde.getTransferable(); 
       List fileList = (List)t.getTransferData(DataFlavor.javaFileListFlavor); 
       File f = (File)fileList.get(0); 
       table.setValueAt(f.getAbsolutePath(), row, column); 
       table.setValueAt(f.length(), row, column+1); 
    } 

En lugar de configurar, puede agregar filas a la tabla al validar que los datos no están duplicados y agregar la información del archivo como filas nuevas a la tabla.