【问题标题】:JavaFx Drag and Drop a file INTO a programJavaFx 将文件拖放到程序中
【发布时间】:2015-12-08 15:26:24
【问题描述】:

嘿社区,我想知道是否可以创建一个程序,允许用户从硬盘驱动器(桌面、文档文件夹、视频文件夹)的任何位置拖动文件并将其放入程序窗口.

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

我正在使用 JavaFx 和 java 7 update 79 jdk。

提前致谢。

【问题讨论】:

  • 我推荐 Java 8+ 用于 JavaFX 开发。此外,如果问题与 Java 8 无关,请删除 java-8 标记。
  • @jewelsea 是的,我的意思是我认为拖放功能的语法变化不大,因此版本很可能无关紧要。无论如何,我问的是代码而不是使用什么版本。不过,请您回复!
  • @TheHoop 我认为 Java 7 和 Java 8 版本之间的语法变化比过去 18 年 Java 历史中的任何变化都多(尤其是应用于事件处理程序之类的东西)。请使标签和问题保持一致。如果您发布一些您尝试过的代码也会很有帮助。
  • @James_D 我目前正在使用 Java 8,并已参考此问题寻求帮助。我没有看到两个版本之间的语法有任何显着差异,尤其是我无法立即修复的任何内容,我可以轻松地说这个问题帮助我解决了我的问题。由于这两个 Java 版本之间发生了少量 相关 更改,我想说保留 Java-8 标记是可以的,因为它可能有助于将来使用 Java 8 的其他人.

标签: java javafx java-8 media-player java-7


【解决方案1】:

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

一个最小的实现需要两个 EventHandler 设置 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);
    }

}

【讨论】:

  • 请同时使用过滤器,以便用户只能选择 mp4 或视频扩展名
【解决方案2】:

使用拖放事件时,您可以尝试以下操作:

获取DragEventDragboard-object 并使用方法getFiles

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

【讨论】:

    【解决方案3】:

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

    例如:

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

    否则它对我不起作用,将文件拖到我的窗格上,没有触发任何东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 2022-09-24
      相关资源
      最近更新 更多