アプリケーションで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 とネイティブ アプリケーション間のファイル転送を実現できます。私の場合、ImageView を拡張する Thumb というクラスを作成し、(とりわけ) ImageView() の初期化に使用されるイメージからパスを返す getFilePath() というメソッドを作成しました。お粗末な例と下手な英語で申し訳ありませんが、今のところ、より詳細な回答をする時間が不足しています。お役に立てば幸いです。乾杯
OS のエクスプローラーへの ImageView 画像抽出のアクション リスナーのサンプル ソースを次に示します (正しく表示するためにアルファ チャネルを削除する jpg 画像のカスタム プロセスを使用)。
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 と pic 名を取得するのに役立ちます。
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;
}
}
予想される時期に誰かを助けることを願っています:-)
よろしく