【问题标题】:JavaFX ignoring drop in drag and drop file onto TextField (Mac OS X)JavaFX忽略拖放文件到TextField(Mac OS X)
【发布时间】:2015-12-07 14:27:12
【问题描述】:

我希望文本字段能够处理从查找器中删除的文件。

这似乎在使用 JavaFX 8 的 Mac OS X 上被忽略了。我看不出代码有任何问题,可以吗?

只有“进入!”被打印出来。 “掉了!”永远不会被打印出来。

...
txtSource = (TextField)scene.lookup("#txtSource");
txtSource.setOnDragEntered(this::handleEnter);
txtSource.setOnDragDropped(this::handleDrop);
...

public void handleEnter(DragEvent event) {
    System.out.println("Entered!");
    event.acceptTransferModes(TransferMode.ANY);
    event.consume();
}

public void handleDrop(DragEvent event) {
    System.out.println("Dropped!");

    Dragboard db = event.getDragboard();
    boolean success = false;
    if (db.hasFiles()) {
        File f = db.getFiles().get(0);
        TextField t = (TextField)event.getAcceptingObject();
        t.setText(f.getAbsolutePath());
        success = true;
    }
    /* let the source know whether the string was successfully 
     * transferred and used */
    event.setDropCompleted(success);
    event.consume();
}

【问题讨论】:

    标签: macos javafx drag-and-drop javafx-8


    【解决方案1】:

    出于某种我不清楚的原因,您需要在dragOver 处理程序中接受传输模式,而不是dragEntered 处理程序:

    txtSource.setOnDragOver(this::handleEnter);
    // txtSource.setOnDragEntered(this::handleEnter);
    

    【讨论】:

    • 谢谢。那行得通。奇怪的。我从教程示例中获得了我的原始代码。这是 OS X 唯一的怪癖吗?顺便说一句,我的 event.getAcceptingObject() 应该是 event.getGestureTarget() 来获取文本字段。
    • 不知道在其他平台上:我只有一个 mac 可以测试。 FWIW 我会明确传递文本字段(或使其成为实例变量):txtSource.setOnDragDropped(e -> handleDragDrop(e, txtSource));private void handleDragDrop(DragEvent e, TextField t) { ... }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2012-10-04
    • 2012-03-11
    • 2015-01-21
    • 2011-04-05
    相关资源
    最近更新 更多