【问题标题】:JavaFX Drag Drop Window Not RespondingJavaFX拖放窗口没有响应
【发布时间】:2015-12-21 01:17:29
【问题描述】:

我正在尝试一个简单的 Java FX 程序来创建一个窗口,我所需要的只是添加读取已删除文件的功能。我有以下代码 sn-p 不会引发任何错误,但也不会让我丢弃任何东西。当我尝试删除文件时,它显示一个红色光标(不允许 Windows 光标)

我使用的是 Windows 8 机器和 JDK 版本 8.0_60。不确定是什么问题。代码有问题吗?我错过了什么吗?

我尝试过的 -

  1. 尝试更改传输模式
  2. 尝试检查文件权限

对不起,如果我是 JavaFx 新手,代码中存在愚蠢的错误。

这里是代码 -

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.input.*;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class DragMe extends Application {

    @Override
    public void start(Stage primaryStage) {
        Label label = new Label("Please Drag Your File Here.");
        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().hasString()) {
                    /* allow for both copying and moving, whatever user chooses */
                    event.acceptTransferModes(TransferMode.ANY);
                }
                event.consume();
            }
        });

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

            @Override
            public void handle(DragEvent event) {
                Dragboard db = event.getDragboard();
                boolean success = false;
                if (db.hasString()) {
                    dropped.setText(db.getString());
                    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("Testing the Drap File");
        primaryStage.setScene(scene);
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

更新

与 NwDx 进行了讨论,我们试图找出不同场景下的拖放。

  1. 如果文件是从 Eclipse 文件树中拖出的,则允许拖放
  2. 如果文件是从任何其他位置拖动的,例如桌面,它不起作用
  3. 尝试为 Eclipse 创建新的工作区,但没有成功。
  4. 尝试在 MS Word 中拖放,效果很好。
  5. 尝试创建一个 JAR 并运行它,它工作正常。

尝试以管理员身份启动 Eclipse,但没有成功。

已解决

以管理员身份运行 Eclipse 会导致此问题。正常运行即可!感谢 NwDx 提供您的代码。 (Unable to drag and drop to Eclipse)

【问题讨论】:

  • 如果要删除文件,您肯定希望dragOver 处理程序中的event.getDragboard().hasFiles()dragDropped 处理程序中的db.getFiles()
  • 我想,但即使复制和粘贴文本也不起作用。我当然可以试试你的建议。
  • 我尝试了您当前编写的示例,并且选择并拖动一些纯文本(来自 Eclipse)工作正常(在 Mac OSX 10.9.5 / JDK 1.8.0u60 上)。
  • 是的。它应该可以正常工作。我没有让它在我的机器上工作。不知道这里出了什么问题。
  • 在您的问题中发布您的平台(带有版本和 JDK 版本的操作系统),看看是否有人可以检查相同的设置。

标签: java javafx


【解决方案1】:

现在我有一个可行的解决方案,希望对你也有用。我已经更改了您要求setOnDragOver 的方式,也许文件没有hasString() 为真,所以我将其更改为event.getDragboard().hasFiles() 并将Transfertype 更改为Copy。但是你可以随意改变它。之后,您需要从 Dragboard 中获取文件(您可能拖动了多个文件)。在我的简单示例中,我只抓取第一个并显示它的绝对路径。

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.input.*;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class DragMe extends Application {

    @Override
    public void start(Stage primaryStage) {
        Label label = new Label("Please Drag Your File Here.");
        Label dropped = new Label("");
        Label content = new Label();
        VBox dragTarget = new VBox();
        dragTarget.getChildren().addAll(label, dropped, content);
        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);
                }
                event.consume();
            }
        });

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

            @Override
            public void handle(DragEvent event) {
                Dragboard db = event.getDragboard();
                List<File> files = (ArrayList<File>) db.getContent(DataFormat.FILES);

                boolean success = false;
                if (files != null) {
                    File file = files.get(0);
                    dropped.setText(file.getAbsolutePath());
                    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("Testing the Drap File");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

【讨论】:

  • 嗯,这很奇怪,我觉得自己很愚蠢。我也试过记事本/记事本++,但没有让它工作。在我尝试文件时,我最终以 Text 结束。文件拖动有什么特殊规则吗?同样,文件拖放也会发生同样的情况。我只是想在窗口中显示文件的路径。
  • 虽然,我什至无法让 Notepad++ 工作。我只能使用 Eclipse 来拖动文本。
  • 我仍在努力让它发挥作用。它不允许我拖动文件。显示红色光标。
  • @Bhush_Techidiot 你认出我对setOnDragOver的改变了吗?
  • @Bhush_Techidiot 有时会出现一些反恶意软件或防病毒软件,它们会随机化或清除剪贴板的内容。也许你安装了一个?
【解决方案2】:

要添加到 NwDx 答案,如果 Eclipse 以管理员身份运行,则拖放将不起作用。

正常运行,运行正常!

参考 - Unable to drag and drop to Eclipse

【讨论】:

  • 很高兴您找到了这个问题的真正原因。
  • 也感谢您的参与 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
相关资源
最近更新 更多