java - JavaFX: Setting Dragboard contents gives wrong wrong PickResult in Mouse Released event -


in question regarding handling dragging treeview, got great answer james_d. helped me cook of needed.

there's 1 issue need resolve: on drop need know exact coordinates of drop location determine needs done. the problem in drag_dropped event, there no drop coordinate information available. doh, totally overlooked getx() , gety() dragevent. solves problem 😎

before knew that, thought of using mouse_released event's x , y coordinates. found when set content of dragboard in drag_detected handler (of cell), these coordinates (and pickresult wrong. feels bug me…

i have modified james_d's sample show mean. when line db.setcontent(cc); disabled, pick result , coordinates shown when dragging treeview onto e.g., canvas (that's dragging onto in application too) fine. doing exact same thing line enabled, results in totally wrong pickresult... bug, or doing silly?

here output sample code dragging element top left of canvas:

(line disabled) : pr=pickresult [node = canvas@4e91835c, point = point3d [x = 4.0, y = 2.0, z = 0.0], distance = 746.4101615137755

(line enabled): pr=pickresult [node = null, point = point3d [x = 842.0, y = -500.0, z = 0.0], distance = 746.4101615137755

notice coordinates totally of, pick result not finding node longer…

code (modified sample james_d in answer earlier question.

import java.util.stream.intstream; import javafx.application.application; import javafx.beans.property.integerproperty; import javafx.beans.property.simpleintegerproperty; import javafx.concurrent.task; import javafx.geometry.insets; import javafx.geometry.pos; import javafx.scene.scene; import javafx.scene.canvas.canvas; import javafx.scene.control.label; import javafx.scene.control.treecell; import javafx.scene.control.treeitem; import javafx.scene.control.treeview; import javafx.scene.input.clipboardcontent; import javafx.scene.input.dataformat; import javafx.scene.input.dragboard; import javafx.scene.input.pickresult; import javafx.scene.input.transfermode; import javafx.scene.layout.borderpane; import javafx.stage.stage;  public class dragboard extends application {      private static int cellcount = 0;     private final dataformat objectdataformat = new dataformat("x-application/java-serialized-object");      @override     public void start(stage primarystage) {         treeview<integer> tree = new treeview<>();         tree.setshowroot(false);          task<treeitem<integer>> buildtreetask = new task<treeitem<integer>>() {              @override             protected treeitem<integer> call() throws exception {                 treeitem<integer> treeroot = new treeitem<>(0);                 intstream.range(1, 10).maptoobj(this::createitem)                         .foreach(treeroot.getchildren()::add);                 return treeroot;             }              private treeitem<integer> createitem(int value) {                 treeitem<integer> item = new treeitem<>(value);                 if (value < 100) {                     (int = 0; < 10; i++) {                         item.getchildren().add(createitem(value * 10 + i));                     }                 }                 return item;             }          };          tree.setcellfactory(tv -> new treecell<integer>() {              {                 system.out.println("cells created: " + (++cellcount));                  setondragdetected(e -> {                     if (!isempty()) {                         dragboard db = startdraganddrop(transfermode.copy);                         clipboardcontent cc = new clipboardcontent();                         cc.put(objectdataformat, getitem());                         db.setcontent(cc);                         label label = new label(string.format("add %,d", getitem()));                         new scene(label);                         db.setdragview(label.snapshot(null, null));                     }                 });                  setonmousereleased(e -> {                     object es = e.getsource();                     pickresult pr = e.getpickresult();                      system.out.println("pr=" + pr);                 });             }              @override             public void updateitem(integer value, boolean empty) {                 super.updateitem(value, empty);                 if (empty) {                     settext(null);                 } else {                     settext(string.format("%,d", value));                 }             }         });          integerproperty total = new simpleintegerproperty();         label label = new label();         label.textproperty().bind(total.asstring("total: %,d"));          label.setondragover(e                 -> e.accepttransfermodes(transfermode.copy));          // in real life use css pseudoclass , external css file background:         label.setondragentered(e -> label.setstyle("-fx-background-color: yellow;"));         label.setondragexited(e -> label.setstyle(""));          label.setondragdropped(e -> {             dragboard db = e.getdragboard();             if (db.hascontent(objectdataformat)) {                 integer value = (integer) db.getcontent(objectdataformat);                 total.set(total.get() + value);                 e.setdropcompleted(true);             }         });          borderpane.setmargin(label, new insets(10));         label.setmaxwidth(double.max_value);         label.setalignment(pos.center);          canvas canvas = new canvas(250, 100);         borderpane root = new borderpane(new label("loading..."));          buildtreetask.setonsucceeded(e -> {             tree.setroot(buildtreetask.getvalue());             root.settop(canvas);             root.setcenter(tree);             root.setbottom(label);         });          primarystage.setscene(new scene(root, 250, 400));         primarystage.show();          thread t = new thread(buildtreetask);         t.setdaemon(true);         t.start();      }      public static void main(string[] args) {         launch(args);     } } 


Comments

Popular posts from this blog

How to connect android app to App engine -

gcc - MinGW's ld cannot perform PE operations on non PE output file -

php - display validation error message next to the textbox in codeigniter -