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 doh, totally overlooked drag_dropped event, there no drop coordinate information available.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
Post a Comment