web-dev-qa-db-fra.com

JavaFx Glissez et déposez un fichier dans un programme

Je me demandais s'il était possible de créer un programme permettant à l'utilisateur de faire glisser un fichier n'importe où sur le disque dur (le bureau, le dossier Documents, le dossier vidéos) et de le déposer dans la fenêtre du programme.

Je crée un lecteur multimédia et je veux pouvoir lire une vidéo en faisant glisser un MP4 dans la fenêtre. Dois-je stocker le fichier dans une variable, ou simplement l'emplacement du fichier dans une variable? De plus, il est important que je conserve le support pour plusieurs plates-formes.

J'utilise JavaFx avec Java 7 update 79 jdk.

Merci d'avance.

15
TheHoop

Voici un exemple simple de glisser-déposer qui définit simplement le nom du fichier et son emplacement. Faites-y glisser des fichiers et cela indique leur nom et leur emplacement. Une fois que vous savez que la lecture du fichier doit être une affaire complètement distincte. Il provient principalement de la documentation d'Oracle: https://docs.Oracle.com/javafx/2/drag_drop/jfxpub-drag_drop.htm

Une implémentation minimale nécessite deux EventHandler s définis sur OnDragOver et 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);
    }

}
12
WillShackleford

Lorsque vous travaillez avec des événements Drag and Drop, vous pouvez essayer les solutions suivantes:

Obtenez un Dragboard- objet de DragEvent et utilisez la méthode getFiles:

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