【问题标题】:JavaFX drag events not firingJavaFX拖动事件未触发
【发布时间】:2017-11-22 15:34:55
【问题描述】:

我正在尝试创建一个功能,允许用户将文件从应用程序(例如 Windows 资源管理器)外部拖到 JavaFX 程序中。不过,我似乎无法触发拖动事件,有什么想法吗?

示例代码...

public class DragTest extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("DragTest");
        Group root = new Group();
        Scene scene = new Scene(root, 400, 400);

        Label label = new Label("Drag files here!");
        label.setStyle("-fx-background-color: skyblue;");

        label.setPrefWidth(300);
        label.setPrefHeight(100);

        // On drag enter
        label.setOnDragEntered((DragEvent event) -> {
            System.out.println("DRAG ENTERED");
            if (event.getGestureSource() != label) {
                event.acceptTransferModes(TransferMode.ANY);
            }
            event.consume();
        });


        // On drag detected
        label.setOnDragOver((DragEvent event) -> {
            System.out.println("DRAG OVER");
            if (event.getGestureSource() != label && event.getDragboard().hasFiles()) {
                event.acceptTransferModes(TransferMode.ANY);
            }
            event.consume();
        });

        // On drag drop
        label.setOnDragDropped((DragEvent event) -> {
            System.out.println("DRAG DROP");
            Dragboard db = event.getDragboard();
            if (db.hasFiles()) {
               label.setText(db.getFiles().size() + " files detected!");
            } else {
                label.setText("No dragged files detected");
            }
            event.setDropCompleted(true);
            event.consume();
        });

        root.getChildren().add(label);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

}

编辑:捕获的 onDragEntered() 事件,似乎根本没有触发。

【问题讨论】:

  • 我相信您必须首先捕获onDragDetected 事件,然后定义允许的拖动类型。请参阅:docs.oracle.com/javase/8/javafx/api/javafx/scene/… 编辑:Err.. 这是在您想从该节点开始拖动的情况下。否则正确的位置可能是onDragEntered,但您必须指定节点允许的拖动类型。
  • 许多 Oracle 示例假设您是从另一个 JavaFX 节点中开始拖动过程​​(在这种情况下没有帮助)。我会尝试捕获onDragEntered 看看是否有帮助。谢谢!

标签: java user-interface javafx drag-and-drop


【解决方案1】:

在同事屏幕上进行了一些测试后,这看起来可能是 4K 显示器上的 JavaFX 的问题。此示例(以及其他在线找到的示例)在 1080p 显示器上按预期工作,但在 4K 显示器上却不行。

我想我必须在 1080p 中测试此功能,并希望我的用户没有 4K 屏幕。

【讨论】:

    猜你喜欢
    • 2019-06-18
    • 2020-01-14
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2015-03-03
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多