2015-12-07 82 views
0

我希望文本字段能够处理查找器中文件的拖放。JavaFX忽略将拖放文件拖放到TextField上(Mac OS X)

这似乎在使用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(); 
} 

回答

0

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

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

感谢。这工作。奇怪。我从教程示例中获得了我的原始代码。这只是一个OS X怪癖吗?顺便说一句我的event.getAcceptingObject()应该是event.getGestureTarget()来获取文本字段。 –

+0

在其他平台上不知道:我只有一个mac进行测试。 FWIW我会明确地传递文本字段(或使其成为一个实例变量):'txtSource.setOnDragDropped(e - > handleDragDrop(e,txtSource));''和'private void handleDragDrop(DragEvent e,TextField t){... }'。 –