【发布时间】: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