我有一个swing应用程序,我想通过将外部文件从Windows资源管理器拖到应用程序来导入外部文件.我有这个基本功能.但是,我想将默认的拖放光标图标更改为适用于应用程序的光标.在按下鼠标键并将其保持在应用程序上时,我无法更改用户可见的光标.如果拖放操作在同一个swing应用程序中,我已经看到了这个工作的示例.我试图使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
}
免责声明:这应该是一条评论,而不是一个答案,但它太长了,不适合评论。如果这个答案完全不正确,我会删除它
我没有对此进行测试,但查看 API 后,TransferHandler我建议您查看一下该TransferHandler#getDragImage方法。
文档有点不清楚当从设置了 的组件发起拖动时是否使用此图像TransferHandler,或者当从应用程序外部发起拖动并且光标移到设置了 的组件时也使用TransferHandler此图像。放。我发现一个示例似乎表明这在 Java 应用程序中确实有效,但对于来自外部应用程序的拖放仍然没有结论
Bug ID 4816922建议使用,TransferHandler#getVisualRepresentation但尚不清楚该 Bug 是否已修复。
| 归档时间: |
|
| 查看次数: |
2072 次 |
| 最近记录: |