我有一个应用程序,我想通过将外部文件从Windows资源管理器拖到应用程序中来导入外部文件。我有这个基本的功能工作。但是,我想将默认的拖放光标图标更改为应用程序相应的游标。当按下鼠标键并将其保持在应用程序上时,我无法更改用户可见的光标。如果拖放操作在同一个swing应用程序中,我已经看过这个例子。我试图用DragGestureListener和DragSource来完成这个任务。似乎除非拖动源在摆动范围内,否则不会调用这些方法。将外部文件拖入swing应用程序时,是否可以更改拖动光标?将外部文件拖入Swing应用程序时设置自定义光标
请参阅该简化的例子:
public class DnDTemplate extends JFrame {
private static final long serialVersionUID = 1L;
private JComponent thePane = null;
private Cursor dropCursor = null;
public DnDTemplate() {
super("Drop File Here");
thePane = (JComponent) getContentPane();
thePane.setTransferHandler(new DndTransferHandler());
ImageIcon imageIcon = new ImageIcon("drop_here.gif");
Image image = imageIcon.getImage();
BufferedImage bufferedImage = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
Graphics graphics = bufferedImage.getGraphics();
graphics.drawImage(image, 0, 0, null);
dropCursor = Toolkit.getDefaultToolkit().createCustomCursor(bufferedImage, new Point(16, 16), "drop cursor");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 300);
}
public static void main(String[] args) {
new DnDTemplate().setVisible(true);
}
class DndTransferHandler extends TransferHandler {
private static final long serialVersionUID = 1L;
@Override
public boolean canImport(TransferHandler.TransferSupport info) {
// This gets called repeatedly while dragged file is over frame
if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
return false;
}
// Even though this method is called at the appropriate time,
// setting the cursor here is of no consequence
info.getComponent().setCursor(dropCursor);
return true;
}
@Override
public boolean importData(TransferHandler.TransferSupport info) {
// this gets called when file is dropped
if (!info.isDrop()) {
return false;
}
Transferable transferable = info.getTransferable();
String importFileName = null;
try {
List<File> fileList = (List<File>) transferable.getTransferData(DataFlavor.javaFileListFlavor);
Iterator<File> iterator = fileList.iterator();
while (iterator.hasNext()) {
File f = iterator.next();
importFileName = f.getAbsolutePath();
}
info.getComponent().setCursor(dropCursor);
thePane.setCursor(dropCursor);
} catch (Exception e) {
return false;
}
System.out.println("Importing " + importFileName);
// Return the cursor back to the default
thePane.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
return true;
}
}
}
不,这没有回答这个问题。我确实看到过,并试图使用setDropTarget。 dragEnter方法在适当的时候被调用,但是光标保持默认的拖放图标,并且不会改变为我指定的那个。 – agility 2012-01-18 02:53:01
我试图在dragOver中设置光标,并且遇到http://bugs.sun.com/view_bug.do?bug_id=4451328中提到的闪烁。可能它毕竟不是固定的。 – tenorsax 2012-01-18 04:02:32