【发布时间】:2011-12-19 08:46:04
【问题描述】:
我正在开发一个应用程序,可以将一个 JLabel 的内容放到另一个 JLabel 中。我为此使用了 NameSlot 类:
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
}
我就是这样初始化的:
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)
有人知道路吗?
【问题讨论】:
-
这里使用的是拖放目标,因为拖放操作是从拖放源开始的,会不会有问题?
-
我不明白你的意思。我应该怎么做?
-
不需要
setPosition()方法。所有组件都已经支持setLocation()方法来执行此操作。 -
@Anthea 没关系...我阅读了有关 awt 的 dnd 类的 api 文档,但未能理解...我只是想知道您是否可以使用 dtde.getSource 获取拖动事件的来源(),因为 dtde.getSource 应该返回 drop 事件的来源。抱歉没能帮上忙……
-
@camicr 更改了 @coolcfan 感谢您的评论,我现在尝试了另一种方式并编辑了问题...
标签: java swing drag-and-drop awt