gpt4 book ai didi

swing - 将外部文件拖入 Swing 应用程序时设置自定义光标

转载 作者:行者123 更新时间:2023-12-04 12:55:52 43 4
gpt4 key购买 nike

我有一个 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;
}

}

}

最佳答案

免责声明:这应该是评论而不是答案,但它太长而无法放入评论中。如果完全不正确,我将删除此答案

我没有对此进行测试,而是查看了 TransferHandler 的 API我建议看看 TransferHandler#getDragImage 方法。

当从 TransferHandler 的组件开始拖动时是否使用此图像,文档有点不清楚。设置,或者也用于从应用程序外部启动拖动并且光标位于 TransferHandler 的组件上。设置。我找到了 an example这似乎表明这在 Java 应用程序中确实有效,但对于来自外部应用程序的拖放仍然没有定论

Bug ID 4816922建议使用 TransferHandler#getVisualRepresentation 但目前尚不清楚该错误是否已修复。

关于swing - 将外部文件拖入 Swing 应用程序时设置自定义光标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8898853/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com