我在我的应用程序中使用JavaFX的Drag and Drop system,到目前为止它一直运行良好。
现在我想支持拖放到外部应用程序,例如。将文件从我的应用程序拖动到资源管理器。我将如何实现这一目标?
答案 0 :(得分:4)
我通过使用:
实现了您的描述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并使用列表填充ClipboardContent,可以实现JavaFX 2与本机应用程序之间的文件传输。在我的例子中,我创建了一个名为Thumb的类,扩展了ImageView和(以及其他一些东西)我创建了一个名为getFilePath()的方法,该方法从用于初始化ImageView()的Image返回Path。我很抱歉这个糟糕的例子和糟糕的英语,但我现在已经没时间给出更详细的答案了。我希望它有所帮助。干杯
答案 1 :(得分:0)
以下是将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方法的Object的帮助下,它帮助我检索数据库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;
}
}
我希望它能在预期的时间帮助某些人: - )
此致