web-dev-qa-db-ja.com

JavaFxプログラムへのファイルのドラッグアンドドロップ

ユーザーがファイルをハードドライブ(デスクトップ、ドキュメントフォルダー、ビデオフォルダー)のどこからでもドラッグしてプログラムのウィンドウにドロップできるようにするプログラムを作成できるかどうか疑問に思っていたコミュニティ。

メディアプレーヤーを作成していますが、MP4をウィンドウにドラッグアンドドロップしてビデオを再生できるようにしたいと考えています。ファイルを変数に格納する必要がありますか、それともファイルの場所だけを変数に格納する必要がありますか?また、クロスプラットフォームのサポートを維持することも重要です。

Java 7 update 79 jdkでJavaFxを使用しています。

前もって感謝します。

18
TheHoop

ファイル名と場所を設定するだけの簡単なドラッグアンドドロップの例を次に示します。ファイルをそこにドラッグすると、ファイルの名前と場所が表示されます。実際にファイルを再生することは、完全に別の問題になるはずです。これは主にOracleのドキュメントから取得されます。 https://docs.Oracle.com/javafx/2/drag_drop/jfxpub-drag_drop.htm

最小限の実装では、2つのEventHandler s OnDragOverとOnDragDroppedを設定する必要があります。

public class DragAndDropTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        Label label = new Label("Drag a file to me.");
        Label dropped = new Label("");
        VBox dragTarget = new VBox();
        dragTarget.getChildren().addAll(label,dropped);
        dragTarget.setOnDragOver(new EventHandler<DragEvent>() {

            @Override
            public void handle(DragEvent event) {
                if (event.getGestureSource() != dragTarget
                        && event.getDragboard().hasFiles()) {
                    /* allow for both copying and moving, whatever user chooses */
                    event.acceptTransferModes(TransferMode.COPY_OR_MOVE);
                }
                event.consume();
            }
        });

        dragTarget.setOnDragDropped(new EventHandler<DragEvent>() {

            @Override
            public void handle(DragEvent event) {
                Dragboard db = event.getDragboard();
                boolean success = false;
                if (db.hasFiles()) {
                    dropped.setText(db.getFiles().toString());
                    success = true;
                }
                /* let the source know whether the string was successfully 
                 * transferred and used */
                event.setDropCompleted(success);

                event.consume();
            }
        });


        StackPane root = new StackPane();
        root.getChildren().add(dragTarget);

        Scene scene = new Scene(root, 500, 250);

        primaryStage.setTitle("Drag Test");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}
20
WillShackleford

ドラッグアンドドロップイベントを操作する場合、次のことを試すことができます。

DragboardDragEventオブジェクトを取得し、メソッドgetFilesを操作します。

private void handleDragDropped(DragEvent event){
    Dragboard db = event.getDragboard();
    File file = db.getFiles().get(0);
}
1
Moritz Schmidt