JavaFX拖放事件是JavaFX中一种常见的交互方式,它允许用户将一个对象从一个位置拖动到另一个位置。它可以用来实现各种功能,如文件的拖放,图像的拖放,文本的拖放等。
JavaFX中的拖放事件是通过DragEvent来处理的。DragEvent是JavaFX中用于处理鼠标和触摸屏上的“drag”事件的对象。当用户在界面上开始一个drag行为时,会触发DragEvent,并将该对象传递到相应的处理函数中。
// 创建一个 DragEvent 监听器 node.setOnDragEntered(new EventHandler<DragEvent>() { @Override public void handle(DragEvent event) { // 处理 DragEvent 事件 } });
在处理DragEvent时,可以使用event.getSource()方法来获取正在处理该事件的Node对象。然后可以使用event.getTarget()方法来获取正在处理该事件的目标Node对象。这样就可以得到正在进行drag行为的Node对象和目标Node对象,并根据需要执行相应的功能。
// 获取正在处理 DragEvent 的 Node 对象 Node source = (Node) event.getSource(); // 获取正在处理 DragEvent 的目标 Node 对象 Node target = (Node) event.getTarget();
此外,还可以使用event.getTransferMode()方法来判断当前drag行为是copy、move还是link等。依据不同情况执行不同功能即可实现不同效果。
// 获得当前 drag 行为 TransferMode mode = event.getTransferMode(); if (mode == TransferMode.COPY) { // 执行 copy 操作 ... } else if (mode == TransferMode.MOVE) { // 执行 move 操作 ... } else if (mode == TransferMode.LINK) { // 执行 link 操作 ... }
总之,JavaFX中的DragEvent是一种常用耐用、易学易用、功能强大、易扩展性强的UI交互方式;它能有效帮助开发者快速实现各种功能;也能有效帮助用户快速实现各种需要。
import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.input.ClipboardContent; import javafx.scene.input.DataFormat; import javafx.scene.input.DragEvent; import javafx.scene.input.Dragboard; import javafx.scene.input.MouseEvent; import javafx.scene.input.TransferMode; import javafx.scene.paint.Color; import javafx.scene.text.Text; import javafx.stage.Stage; public class Main extends Application { final Text source = new Text(50, 100, "DRAG ME"); final Text target = new Text(150, 100, "DROP HERE"); private static final DataFormat customFormat = new DataFormat("helloworld.custom"); public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage primaryStage) { Group root = new Group(); Scene scene = new Scene(root, 300, 250); root.getChildren().addAll(source,target); source.setOnDragDetected(new EventHandler<MouseEvent>() { public void handle(MouseEvent event) { Dragboard db = source.startDragAndDrop(TransferMode.ANY); ClipboardContent content = new ClipboardContent(); content.putString(source.getText()); db.setContent(content); event.consume(); } }); target.setOnDragOver(new EventHandler<DragEvent>() { public void handle(DragEvent event) { if (event.getGestureSource() != target && event.getDragboard().hasString()) { event.acceptTransferModes(TransferMode.MOVE); } event.consume(); } }); target.setOnDragEntered(new EventHandler<DragEvent>() { public void handle(DragEvent event) { if (event.getGestureSource() != target && event.getDragboard().hasString()) { target.setFill(Color.GREEN); } event.consume(); } }); target.setOnDragExited(new EventHandler<DragEvent>() { public void handle(DragEvent event) { target.setFill(Color.BLACK); event.consume(); } }); target.setOnDragDropped(new EventHandler<DragEvent>() { public void handle(DragEvent event) { Dragboard db = event.getDragboard(); boolean success = false; if (db.hasString()) { target.setText(db.getString()); success = true; } event.setDropCompleted(success); event.consume(); } }); source.setOnDragDone(new EventHandler<DragEvent>() { public void handle(DragEvent event) { if (event.getTransferMode() == TransferMode.MOVE) { source.setText(""); } event.consume(); } }); primaryStage.setScene(scene); primaryStage.show(); } }
上面的代码生成以下结果。
Java 实例 - 获取目录最后修改时间 Java 实例以下实例演示了使用 File 类的 file.lastModified() 方法来获取目录的最后修改时间...
Java 实例 - 查看当前工作目录 Java 实例以下实例演示了使用 System 的 getProperty() 方法来获取当前的工作目录:class Main { ...
Java 实例 - 在链表(LinkedList)的开头和结尾添加元素 Java 实例以下实例演示了如何使用 LinkedList 类的 addFirst() 和 addLa...
Java 实例 - 压栈出栈的方法实现字符串反转 Java 实例以下实例演示了使用用户自定义的方法 StringReverserThroughStack() 来实现...
Java 实例 - 查找 List 中的最大最小值 Java 实例以下实例演示了如何使用 Collections 类的 max() 和 min() 方法来获取List中最...