我正在處理可以將一個JLabel的內容放入另一個JLabel的應用程序。我使用這個類NameSlot:拖放JLabel:如何獲取拖動源
public class NameSlot extends JLabel implements DropTargetListener{
NameSlot(String name){
super(name);
new DropTarget(this,this);
this.setTransferHandler(new TransferHandler("foreground"));
MouseListener listener = new MouseAdapter() {
public void mousePressed(MouseEvent me) {
JLabel comp = (JLabel) me.getSource();
TransferHandler handler = comp.getTransferHandler();
handler.exportAsDrag(comp, me, TransferHandler.COPY);
}
};
this.addMouseListener(listener);
}
@Override
public void dragEnter(DropTargetDragEvent dtde) {
// TODO Auto-generated method stub
}
@Override
public void dragExit(DropTargetEvent dte) {
// TODO Auto-generated method stub
}
@Override
public void dragOver(DropTargetDragEvent dtde) {
// TODO Auto-generated method stub
}
@Override
public void drop(DropTargetDropEvent dtde) {
// DropTarget dt = (DropTarget) dtde.getSource();
// NameSlot ns = (NameSlot) dt.getComponent();
try {
JLabel l =(JLabel) dtde.getTransferable().getTransferData(DataFlavor.stringFlavor);
System.out.println("drop detected from "+l.getText()+" to "+this.getText());
} catch (UnsupportedFlavorException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void dropActionChanged(DropTargetDragEvent dtde) {
// TODO Auto-generated method stub
}
這就是我initiale它:
this.setLayout(null);
NameSlot ns = new NameSlot("test");
ns.setLocation(20, 20);
this.add(ns);
NameSlot ns2 = new NameSlot("test2");
ns2.setLocation(20, 20);
this.add(ns2);
嘗試使用dtde.getSource()之後,並取消它,因爲coolcfans評論,我現在試圖讓拖動源使用DropTargetEvent的Transferable。我得到的例外:
java.awt.datatransfer.UnsupportedFlavorException: Unicode String
at javax.swing.TransferHandler$PropertyTransferable.getTransferData(Unknown Source)
at sun.awt.dnd.SunDropTargetContextPeer.getTransferData(Unknown Source)
at sun.awt.datatransfer.TransferableProxy.getTransferData(Unknown Source)
at java.awt.dnd.DropTargetContext$TransferableProxy.getTransferData(Unknown Source)
at an.judosoft.view.bracketSheets.factory.NameSlot.drop(NameSlot.java:71)
任何人都知道的方式?
在這裏,您使用的拖放目標,無論拖放操作從拖動源開始,這可能是一個問題嗎? – coolcfan 2011-12-19 09:54:13
我不明白你的意思。我該怎麼做呢? – Anthea 2011-12-19 12:42:04
沒有必要使用'setPosition()'方法。所有組件都已經支持'setLocation()'方法來執行此操作。 – camickr 2011-12-19 16:07:39