问题描述:

  在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);
// });
// }

问题记录:JavaFx 鼠标滑轮滚动事件监听!的更多相关文章

  1. java鼠标与键盘事件监听

    package cn.stat.p3.windowdemo; import java.awt.Button; import java.awt.FlowLayout; import java.awt.F ...

  2. js鼠标滑轮滚动事件绑定(兼容主流浏览器)

    /** Event handler for mouse wheel event. *鼠标滚动事件 */ var wheel = function(event) { var delta = 0; if ...

  3. WebView使用详解(二)——WebViewClient与常用事件监听

      登录|注册     关闭 启舰 当乌龟有了梦想……       目录视图 摘要视图 订阅 异步赠书:Kotlin领衔10本好书      免费直播:AI时代,机器学习如何入门?      程序员8 ...

  4. js判断鼠标滑轮滚动方向并根据滚动的方向触发不同的事件

    <script> var scrollFunc = function (e) { var direct = 0; e = e || window.event; if (e.wheelDel ...

  5. java 事件监听 - 鼠标

    java 事件监听 - 鼠标 //事件监听 //鼠标事件监听 //鼠标事件监听有两个实现接口 //1.MouseListener 普通的鼠标操作 //2.MouseMotionListener 鼠标的 ...

  6. JAVA之旅(三十一)——JAVA的图形化界面,GUI布局,Frame,GUI事件监听机制,Action事件,鼠标事件

    JAVA之旅(三十一)--JAVA的图形化界面,GUI布局,Frame,GUI事件监听机制,Action事件,鼠标事件 有段时间没有更新JAVA了,我们今天来说一下JAVA中的图形化界面,也就是GUI ...

  7. 利用JavaFx开发RIA桌面应用-事件监听

    1 事件监听 最近利用javaFX开发桌面客户端,碰到需要给各种UI控件添加事件监听,在这里做一个简单的小结,供日后参考. 2 分类处理 在JavaGUI 和Android中,事件通常通过实现list ...

  8. PIE SDK地图鼠标事件监听

    1.功能简介 地图鼠标事件包含鼠标的按下MouseDown(),弹起MouseUp(),移动MouseMove()等事件,通过这些事件可以对地图进行动态的操作,接下来以地图状态栏的信息为例具体介绍如何 ...

  9. Vue 事件监听实现导航栏吸顶效果(页面滚动后定位)

    Vue 事件监听实现导航栏吸顶效果(页面滚动后定位) Howie126313 关注 2017.11.19 15:05* 字数 100 阅读 3154评论 0喜欢 0 所说的吸顶效果就是在页面没有滑动之 ...

随机推荐

  1. canvas学习之API整理笔记(一)

    其实canvas本身很简单,就是去学习它的API,多看实例,多自己动手练习,多总结.但是canvas的API实在是有点多,对于初学者来说,可能学到一半就止步不前了.我也有这种感觉,在学习的过程中,编写 ...

  2. 国外远控软件DarkComet-RAT

    下载地址:[点此下载] 使用步骤: 注册noip.org账号创建主机地址. 安装并配置DUC. 配置监听端口 配置NO-IP Updater 然后点击Update ,配置成功则会提示Success. ...

  3. Android 7.1 App Shortcuts使用

    Android 7.1 App Shortcuts使用 Android 7.1已经发了预览版, 这里是API Overview: API overview. 其中App Shortcuts是新提供的一 ...

  4. 简单的学习心得:网易云课堂Android开发第六章SQLite与ContentProvider

    一.SQLite 1.基本操作: (1)创建数据库:在SQLiteOpenHelper的子类构造器中创建. (2)创建表:在SQLiteOpenHelper的子类onCreate方法中,调用execS ...

  5. Atitit. 项目文档目录大纲 总集合  v2

    Atitit. 项目文档目录大纲 总集合  v2 -----Atitti.原有项目源码的架构,框架,配置与环境说明 v3 q511 -----Atitit.开发环境 与 工具 以及技术框架 以及 注意 ...

  6. Spring类型转换 ConversionSerivce Convertor

    以String转Date为例:   定义转换器:    import java.text.ParseException; import java.util.Date; import org.apach ...

  7. 如何评价一个RPC框架的性能

    协议:数据传输的格式,通信双方的契约.   传输:使用何种传输通道传输数据.   线程:接收到数据,如何分发数据进行处理.

  8. MySql踩坑总结

    衣带渐宽终不悔,为伊消得人憔悴,众里寻他千百度,蓦然回首,那人却在灯火阑珊处好通顺的句子哈哈 转了那么多弯,才明白问题就在一个地方.睡觉之前想明白了问题,还是经验太少.王国维的治学三境界: 昨夜西风凋 ...

  9. rhel7 单用户修改root密码

    rhel7密码忘记的时候,可以通过单用户模式修改密码 1.修改 引导文件,添加rw init=/sysroot/bin/sh ,ctrl+x启动 2.切换根chroot /sysroot3.使用pas ...

  10. 父容器利用opacity设置透明后,子元素跟着变透明的解决方案

    背景半透明,子元素不透明的效果经常需要用到.通常对父容器使用opacity属性时,子元素也跟着变透明,所以不妨设置父容器的 background-color:rgba(r,g,b,x); 其中x取值从 ...