問題記錄: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);
//                });
//            }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM