zoukankan      html  css  js  c++  java
  • 问题记录: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);
    //                });
    //            }
  • 相关阅读:
    Vulnhub_DC4 记录
    文件上传(解析)漏洞
    开源情报搜集
    Vulnhub_DC3 记录
    “恶意”利用IPC$
    Vulnhub_DC2 记录
    Vulnhub_DC1 记录
    合天网安实验室 渗透测试项目二
    合天网安实验室 渗透测试项目一
    编程如写作
  • 原文地址:https://www.cnblogs.com/kissfu/p/6072792.html
Copyright © 2011-2022 走看看