我在我的应用程序中使用 JavaFX 的拖放系统,到目前为止它运行良好。
现在我想支持拖放到外部应用程序,例如。将文件从我的应用程序拖到资源管理器中。我将如何实现这一目标?
我在我的应用程序中使用 JavaFX 的拖放系统,到目前为止它运行良好。
现在我想支持拖放到外部应用程序,例如。将文件从我的应用程序拖到资源管理器中。我将如何实现这一目标?
我已经通过使用实现了您所描述的:
Vector<File> files = new Vector<File>();
private ClipboardContent filesToCopyClipboard = new ClipboardContent();
...
final ObjectWithAReturnablePathField draggableObj = new ObjectWithAReturnablePathField();
...
draggableObj.setOnDragDetected(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent me)
{
Dragboard db = draggableObj.startDragAndDrop(TransferMode.ANY);
try
{
File f = new File(new URI(draggableObj.getFilePath()));
files.add(f);
filesToCopyClipboard.putFiles(files);
}
catch (URISyntaxException e)
{
e.printStackTrace();
}
db.setContent(filesToCopyClipboard);
me.consume();
}
});
draggableObj.setOnDragDone(new EventHandler<DragEvent>()
{
@Override
public void handle(DragEvent me)
{
me.consume();
}
});
意思是:
通过使用任何可返回文件路径的可拖动对象(任何节点)的 setOnDragDetected 方法上的 TransferMode.ANY 使用列表填充 ClipboardContent,可以实现 JavaFX 2 和本机应用程序之间的文件传输。在我的例子中,我创建了一个名为 Thumb 的类来扩展 ImageView,并且(除其他外)我创建了一个名为 getFilePath() 的方法,它从用于初始化 ImageView() 的 Image 返回路径。对于糟糕的例子和糟糕的英语,我很抱歉顺便说一句,但到目前为止,我已经没有时间给出更详细的答案了。我希望它有所帮助。干杯
这是一个操作侦听器的示例源,用于将 ImageView 图像提取到操作系统的资源管理器(使用 jpg 图像的自定义过程来删除 alpha 通道以正确显示它):
inputImageView.setOnDragDetected(new EventHandler <MouseEvent>() {
@Override
public void handle(MouseEvent event) {
// for paste as file, e.g. in Windows Explorer
try {
Clipboard clipboard Clipboard.getSystemClipboard();
Dragboard db = inputImageView.startDragAndDrop(TransferMode.ANY);
ClipboardContent content = new ClipboardContent();
Image sourceImage = inputImageView.getImage();
ImageInfo imageInfo = (ImageInfo) inputImageView.getUserData();
String name = FilenameUtils.getBaseName(imageInfo.getName());
String ext = FilenameUtils.getExtension(imageInfo.getName());
///Avoid get "prefix lenght too short" error when file name lenght <= 3
if (name.length() < 4){
name = name+Long.toHexString(Double.doubleToLongBits(Math.random()));;
}
File temp = File.createTempFile(name, "."+ext);
if (ext.contentEquals("jpg")|| ext.contentEquals("jpeg")){
BufferedImage image = SwingFXUtils.fromFXImage(sourceImage, null); // Get buffered image.
BufferedImage imageRGB = new BufferedImage(image.getWidth(),image.getHeight(),
BufferedImage.OPAQUE);
Graphics2D graphics = imageRGB.createGraphics();
graphics.drawImage(image, 0, 0, null);
ImageIO.write(imageRGB, ext, temp);
graphics.dispose();
ImageIO.write(imageRGB,
ext, temp);
}else{
ImageIO.write(SwingFXUtils.fromFXImage(sourceImage, null),
ext, temp);
}
content.putFiles(java.util.Collections.singletonList(temp));
db.setContent(content);
clipboard.setContent(content);
event.consume();
temp.deleteOnExit();
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
});
借助传递给 imageView 的 setUserData 方法的对象,它可以帮助我检索数据库 ID 和图片名称:
public class ImageInfo {
private String imageInfo;
private int inputId;
@Override
public String toString() {
return imageInfo;
}
public ImageInfo(String imageInfo, int inputId) {
this.imageInfo = imageInfo;
this.inputId = inputId;
}
public String getName() {
return imageInfo;
}
public void setName(String imageInfo) {
this.imageInfo = imageInfo;
}
public int getIndex() {
return inputId;
}
public void setIndex(int areaindex) {
this.inputId = inputId;
}
}
我希望它会在预期的时间帮助某人:-)
问候