首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaFx将文件拖放到程序中

JavaFx将文件拖放到程序中
EN

Stack Overflow用户
提问于 2015-09-12 09:03:07
回答 3查看 16K关注 0票数 24

嘿,我想知道是否有可能创建一个程序,允许用户从硬盘驱动器(桌面,文档文件夹,视频文件夹)的任何地方拖动文件,并将其放入程序的窗口中。

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

我使用的是带有java7更新79jdk的JavaFx。

提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2015-09-16 08:29:27

下面是一个简单的拖放示例,它只设置文件名和位置。将文件拖到其中,它会显示文件的名称和位置。一旦您知道实际播放该文件应该是完全不同的事情。它主要取自甲骨文的文档:https://docs.oracle.com/javafx/2/drag_drop/jfxpub-drag_drop.htm

一个最小的实现需要两个EventHandler集OnDragOver和OnDragDropped。

代码语言:javascript
复制
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);
    }

}
票数 30
EN

Stack Overflow用户

发布于 2018-06-19 03:10:46

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

获取DragEventDragboard-object并使用getFiles方法

代码语言:javascript
复制
private void handleDragDropped(DragEvent event){
    Dragboard db = event.getDragboard();
    File file = db.getFiles().get(0);
}
票数 2
EN

Stack Overflow用户

发布于 2021-11-25 14:22:23

我通过添加两个事件处理程序解决了这个问题。一个用于DragDropped事件,另一个用于DragOver事件。

例如:

代码语言:javascript
复制
@FXML
void handleFileOverEvent(DragEvent event)
{
    Dragboard db = event.getDragboard();
    if (db.hasFiles())
    {
        event.acceptTransferModes(TransferMode.COPY);
    }
    else
    {
        event.consume();
    }
}

@FXML
void handleFileDroppedEvent(DragEvent event)
{
    Dragboard db = event.getDragboard();
    File file = db.getFiles().get(0);

    handleSelectedFile(file);
}

否则它对我不起作用,将文件拖到我的面板上,不会触发任何事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32534113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档