问题记录:JavaFx 鼠标滑轮滚动事件监听!
问题描述:
在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); // }); // }