# Drag & Drop einer einzelnen Zelle (JTable)



## rogerle (22. Aug 2005)

Hallo zusammen !

Ich habe mit folgendem Code das im Titel genannte ermöglicht:


```
public class ObjectTransferable implements Transferable
{
  public static final DataFlavor FLAVOR=new DataFlavor(Object.class,"Object");

  Object myValue;

  public ObjectTransferable(Object value)
  {
    myValue=value;
  }

  public DataFlavor[] getTransferDataFlavors()
  {
    return new DataFlavor[]{FLAVOR};
  }

  public boolean isDataFlavorSupported(DataFlavor flavor)
  {
    return flavor==FLAVOR;
  }

  public Object getTransferData(DataFlavor flavor) throws
         UnsupportedFlavorException, IOException
  {
    if(flavor==FLAVOR) return myValue;
    else throw new UnsupportedFlavorException(flavor);
  }    

}

public class TableHandler extends TransferHandler
{
  JTable  myTable;

  public TableHandler(JTable table)
  {
    myTable = table;
    table.setTransferHandler(this);
    table.setDragEnabled(true);
  }

  public boolean canImport(JComponent comp, DataFlavor[] transferFlavors)
  {
    if (myTable != comp) return false;
    // eventuell DataFlavor noch prüfen
    return true;
  }

  protected Transferable createTransferable(JComponent c)
  {
    if (c == myTable)
    {
      int row = myTable.getSelectedRow();
      int col = myTable.getSelectedColumn();
      Object value = myTable.getModel().getValueAt(row, col);

      // Hier ein entsprechendes Transferable benutzen
      return new ObjectTransferable(value);
    }
    else
    {
      return super.createTransferable(c);
    }
  }

  public boolean importData(JComponent comp, Transferable t)
  {
    if (comp == myTable)
    {
      try
      {
        Object value = t.getTransferData(ObjectTransferable.FLAVOR);

        int row = myTable.getSelectedRow();
        int col = myTable.getSelectedColumn();
        myTable.getModel().setValueAt(value,row, col);
        return true;
      }
      catch (Exception e)
      {
      }
    }
    return super.importData(comp, t);
  }

  public int getSourceActions(JComponent c)
  {
    if (myTable == c) return DnDConstants.ACTION_COPY;
    else return super.getSourceActions(c);
  }

}
```

Nun noch mit new TableHandler(table)  initialisieren und es funzt.

Was mich nun stört ist, dass wenn ich in eine Zelle klicke diese als erstes selektiert wird
und ich nicht sofort mit dem Drag beginnen kann.
Erst beim 2. Klick in die Zelle klappt es wie gewünscht ?!

Was kann ich tun ??

Danke

Rogerle


----------



## Sky (22. Aug 2005)

Hmm, ohne es geprüft zu haben: Hört sich nach Standard-Verhalten der JTable an. Vielleicht einfach mal einen MouseListener ranhängen und beim ersten Klick selbst gewünschte Aktion ausführen.


----------



## GRudiD (4. Mrz 2007)

bei mir hats damit gefunzt

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


----------

