问题记录: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);
//                });
//            }

 

转载于:https://www.cnblogs.com/kissfu/p/6072792.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值