問題描述:
在listview的item里面添加鼠標拖拽排序功能。代碼如下:
setOnMouseDragged(event -> { //設定鼠標長按0.3秒后才可拖拽 防止誤操作 isCanDrag =true; //(System.currentTimeMillis() - mousedownMills) > 300; }); setOnDragDetected(event -> { if (this.getTestAction() == null && !this.isScreenshotStep || !isCanDrag) { return; } scriptShowController.listView.getSelectionModel().clearSelection(); scriptShowController.listView.getSelectionModel().select(items.indexOf(this)); //開始拖拽 Dragboard dragboard = startDragAndDrop(TransferMode.MOVE); //當前步驟截圖 WritableImage snapshot = this.getParent().snapshot(new SnapshotParameters(), null); ImageView ig= new ImageView(snapshot); // ig.setOnScroll(e->{ // double deltaY = e.getDeltaY(); // log.info("item:"+deltaY); // }); // javafx.scene.Node s= ((javafx.scene.Node)event.getSource()); // javafx.scene.Node t= (javafx.scene.Node)event.getTarget(); // if(s!=null) { // s.setOnScroll(e -> { // double deltaY = e.getDeltaY(); // log.info("S:" + deltaY); // }); // } // if(t!=null) { // t.setOnScroll(e -> { // double deltaY = e.getDeltaY(); // log.info("T:" + deltaY); // }); // } dragboard.setDragView(ig.getImage()); ClipboardContent content = new ClipboardContent(); content.putString(String.valueOf(items.indexOf(this))); dragboard.setContent(content); event.consume(); }); //拖拽經過的item設置TransferMode setOnDragOver(event -> { if (this.getTestAction() == null && !this.isScreenshotStep) { return; } if (!event.getDragboard().getString().equals(String.valueOf(items.indexOf(this))) && event.getDragboard().hasString()) { event.acceptTransferModes(TransferMode.MOVE); } event.consume(); }); //拖拽進入Item時設置透明度0.3 setOnDragEntered(event -> { if (!event.getDragboard().getString().equals(String.valueOf(items.indexOf(this))) && event.getDragboard().hasString()) { setOpacity(0.3); log.info("setOnDragEntered"); } }); //拖拽離開Item時設置為不透明 setOnDragExited(event -> { if (!event.getDragboard().getString().equals(String.valueOf(items.indexOf(this))) && event.getDragboard().hasString()) { setOpacity(1); log.info("setOnDragExited"); } }); //拖拽放下時的相關邏輯 setOnDragDropped(event -> { if (this.getTestAction() == null && !this.isScreenshotStep) { return; } Dragboard db = event.getDragboard(); boolean success = false; if (db.hasString()) { //調整Item的位置 StepItemController dragItem = (StepItemController) event.getGestureSource(); int draggedIdx = items.indexOf(dragItem); int thisIdx = items.indexOf(this); if (draggedIdx != thisIdx) { items.remove(draggedIdx); items.add(thisIdx, dragItem); //更新角標 this.scriptShowController.getLogic().updateStepIndexs(); //更新TestAction順序 SingleTestCase.getInstance().dragActions(draggedIdx, thisIdx); if (UIController.getScriptShowController() != null) { UIController.getScriptShowController().setSaveScript(true); } UndoRedoUtil.addDragUndo(draggedIdx, thisIdx); } scriptShowController.listView.getSelectionModel().clearSelection(); scriptShowController.listView.getSelectionModel().select(thisIdx); success = true; } setOpacity(1); isCanDrag = false; event.setDropCompleted(success); event.consume(); log.info("setOnDragDropped"); }); setOnDragDone(DragEvent::consume);
windows上當點擊左鍵拖拽期間,無法滾動鼠標滑輪實現listview的滾動條上下滾動。在mac上可以自動實現。
問題解決思路:
第一種思路,監視setOnScroll((ScrollEvent event)事件,但是無法實現上訴問題,拖拽期間無法監視鼠標滑輪滾動。代碼如下:
// for (javafx.scene.Node node: this.scriptShowController.listView.lookupAll(".scroll-bar")) { // if (node instanceof javafx.scene.control.ScrollBar) { // final javafx.scene.control.ScrollBar bar = (javafx.scene.control.ScrollBar) node; // bar.valueProperty().addListener(new javafx.beans.value.ChangeListener<Number>() { // @Override // public void changed(javafx.beans.value.ObservableValue<? extends Number> value, Number oldValue, Number newValue) { // log.info(bar.getOrientation() + " " + newValue); // } // }); // } // } // setOnScroll((ScrollEvent event) -> { // double deltaY = event.getDeltaY(); // log.info("item:"+deltaY); // });
第二種思路,設想在拖拽期間有一個層次,在該層次添加監視,但是無效。代碼如下:
// ig.setOnScroll(e->{//DragView的層次 // double deltaY = e.getDeltaY(); // log.info("item:"+deltaY); // }); // javafx.scene.Node s= ((javafx.scene.Node)event.getSource()); // javafx.scene.Node t= (javafx.scene.Node)event.getTarget(); // if(s!=null) { // s.setOnScroll(e -> { // double deltaY = e.getDeltaY(); // log.info("S:" + deltaY); // }); // } // if(t!=null) { // t.setOnScroll(e -> { // double deltaY = e.getDeltaY(); // log.info("T:" + deltaY); // }); // }