拖放到其他应用程序和操作系统?
问题描述:
我在我的应用程序中使用JavaFX的Drag and Drop system,到目前为止它一直运行良好。拖放到其他应用程序和操作系统?
现在我想支持拖放到外部应用程序,例如。将文件从我的应用程序拖到资源管理器中。我将如何实现这一目标?
答
我所取得你所描述的使用:
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();
}
});
这意味着:
有可能通过填充ClipboardContent使用该列表来实现的JavaFX 2和本地应用程序之间的文件转移TransferMode.ANY,任何可拖动对象(任何节点)的setOnDragDetected方法,它可以返回文件的路径。在我的情况下,我创建了一个名为Thumb扩展ImageView的类,并且(除其他外)我创建了一个名为getFilePath()的方法,该方法从用于初始化ImageView()的Image中返回Path。对于这个贫穷的例子和可怜的英语,我很抱歉,但是我现在没时间给出更详细的答案。我希望它有帮助。干杯
答
下面是用于在ImageView的图像提取到OS”探险动作侦听器样品源(通过自定义处理为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;
}
}
我希望这将有助于somenone在预期的时间:-)
Regards
感谢您的示例。但是,它只会将文件放入剪贴板。没有任何迹象表明应用程序或系统应以任何方式复制或处理这些文件,并且setOnDragDone的DragEvent在您调用getGestureTarget时返回null,而不是更有用的信息,如您将文件拖动到的目录(如果您例如,将文件拖到系统资源管理器中)。 – Timst 2012-07-10 09:16:18
当您使用TransferMode.ANY(或移动)时,它将从剪贴板移动到资源管理器。它在MacOS X finder上像一个魅力。在Windows上尝试一下,我不明白为什么它不起作用 – 2012-07-10 11:08:14
哦,是的,我再次尝试它,它在Ubuntu上工作得很好。非常感谢! – Timst 2012-07-11 09:11:32