Windowsエクスプローラから外部ファイルをアプリケーションにドラッグして外部ファイルをインポートしたいスイングアプリケーションがあります。私はこの基本的な機能が働いています。しかし、デフォルトのドラッグ・アンド・ドロップ・カーソル・アイコンをアプリケーションの適切なカーソルに変更したいと思います。私はマウスのキーが押され、アプリケーションの上に保持されている間、ユーザーに見えるカーソルを変更することができませんでした。ドラッグアンドドロップ操作が同じスイングアプリケーション内にある場合、この作業の例を見てきました。 DragGestureListenerとDragSourceを使用してこれを達成しようとしましたが、役に立たないです。ドラッグ元がスイング内になければ、これらのメソッドは呼び出されないようです。スイングアプリケーションに外部ファイルをドラッグするときにドラッグカーソルを変更することはできますか?これはコメントしていない答えていたはずですが、コメントで収まるようにあまりにも長いです:外部ファイルを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
私はdragOverにカーソルをセットしようとしましたが、http://bugs.sun.com/view_bug.do?bug_id=4451328に記載されているちらつきを経験しました。結局のところ固定ではないかもしれません。 – tenorsax