JavaFx将文件拖放到程序中

JavaFx将文件拖放到程序中,java,javafx,java-8,media-player,java-7,Java,Javafx,Java 8,Media Player,Java 7,Hey there community我想知道是否有可能创建一个程序,允许用户从硬盘上的任何位置(桌面、文档文件夹、视频文件夹)拖动文件,并将其放入程序窗口 我正在创建一个媒体播放器,我希望能够通过将MP4拖放到窗口来播放视频。我需要将文件存储在变量中,还是只将文件的位置存储在变量中。另外,我保持对跨平台的支持也很重要 我正在使用JavaFx和Java7更新79 jdk 提前感谢。这里是一个简单的拖放示例,只需设置文件名和位置。将文件拖动到它,它会显示它们的名称和位置。一旦你知道实际播放这个文件

Hey there community我想知道是否有可能创建一个程序,允许用户从硬盘上的任何位置(桌面、文档文件夹、视频文件夹)拖动文件,并将其放入程序窗口

我正在创建一个媒体播放器,我希望能够通过将MP4拖放到窗口来播放视频。我需要将文件存储在变量中,还是只将文件的位置存储在变量中。另外,我保持对跨平台的支持也很重要

我正在使用JavaFx和Java7更新79 jdk


提前感谢。

这里是一个简单的拖放示例,只需设置文件名和位置。将文件拖动到它,它会显示它们的名称和位置。一旦你知道实际播放这个文件应该是完全独立的事情。它主要来自Oracle的文档:

一个最小的实现需要两个
EventHandler
s set-OnDragOver和ondragdroped

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);
    }

}
公共类DragAndDropTest扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
Label Label=新标签(“将文件拖到我身边”);
标签已删除=新标签(“”);
VBox dragTarget=新的VBox();
dragTarget.getChildren().addAll(标签,已删除);
dragTarget.setOnDragOver(新的EventHandler(){
@凌驾
公共无效句柄(DrageEvent事件){
如果(event.getGestureSource()!=dragTarget
&&event.getDragboard().hasFiles()){
/*允许复制和移动,无论用户选择什么*/
事件.acceptTransferModes(TransferMode.COPY\u或\u MOVE);
}
event.consume();
}
});
setOnDragDropped(新的EventHandler(){
@凌驾
公共无效句柄(DrageEvent事件){
Dragboard db=event.getDragboard();
布尔成功=假;
if(db.hasFiles()){
drop.setText(db.getFiles().toString());
成功=真实;
}
/*让源知道字符串是否已成功删除
*转让和使用*/
事件。setDropCompleted(成功);
event.consume();
}
});
StackPane root=新的StackPane();
root.getChildren().add(dragTarget);
场景=新场景(根,500250);
primaryStage.setTitle(“阻力测试”);
初级阶段。场景(场景);
primaryStage.show();
}
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
发射(args);
}
}

处理拖放事件时,可以尝试以下操作:

获取
DragEvent
Dragboard
-对象,并使用方法
getFiles

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

我推荐Java8+用于JavaFX开发。此外,如果问题与java 8无关,请删除java-8标记。@jewelsea是的,我的意思是,我认为拖放函数的语法没有太大变化,因此版本很可能与此无关。无论如何,我问的是代码,而不是使用什么版本。谢谢你的回复@我认为Java 7和Java 8版本之间的语法变化比Java 18年历史上的任何一个版本都要多(尤其适用于事件处理程序)。请使标签和问题保持一致。如果您能发布一些您尝试过的代码,这也会很有帮助。@James\u D我目前正在使用java8,并参考了这个问题寻求帮助。我看不出两个版本在语法上有任何显著差异,特别是我无法立即修复的任何问题,我可以很容易地说,这个问题帮助我解决了我的问题。由于这两个版本的Java之间发生了少量的相关更改,我认为保留
Java-8
标记是可以的,因为它可能会帮助将来使用Java 8的其他人。请使用过滤器,以便用户只能选择mp4或视频扩展