我最近不得不为FlexGanttFX实现自动滚动功能,并认为我的解决方案可能对其他人有用。 您可以在下面的清单中找到它的基本概念。 主要思想是使用后台线程来调整列表视图使用的虚拟流节点的像素位置。 当检测到“靠近”顶部或底部边缘的拖拉时,线程开始。 “接近”由接近变量定义。

通过为接近值使用属性以及为线程化工作使用类型“任务”和“服务”,显然可以改进此代码。

package com.dlsc;import javafx.application.Platform;
import javafx.scene.Node;
import javafx.scene.control.ListView;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.Region;/** Yes, unfortunately we need to use private API for this.*/
import com.sun.javafx.scene.control.skin.VirtualFlow;public class AutoscrollListView<T> extends ListView<T> {final double proximity = 20;public AutoscrollListView() {addEventFilter(MouseEvent.DRAG_DETECTED,evt -> startDrag());addEventFilter(DragEvent.DRAG_OVER,evt -> autoscrollIfNeeded(evt));addEventFilter(DragEvent.DRAG_EXITED,evt -> stopAutoScrollIfNeeded(evt));addEventFilter(DragEvent.DRAG_DROPPED,evt -> stopAutoScrollIfNeeded(evt));addEventFilter(DragEvent.DRAG_DONE,evt -> stopAutoScrollIfNeeded(evt));}private void startDrag() {Dragboard db = startDragAndDrop(TransferMode.MOVE);ClipboardContent content = new ClipboardContent();/** We have to add some content, otherwise drag over* will not be called.*/content.putString("dummy");db.setContent(content);}private void autoscrollIfNeeded(DragEvent evt) {evt.acceptTransferModes(TransferMode.ANY);/** Determine the "hot" region that will trigger automatic scrolling.* Ideally we use the clipped container of the list view skin but when* the rows are empty the dimensions of the clipped container will be* 0x0. In this case we try to use the virtual flow.*/Region hotRegion = getClippedContainer();if (hotRegion.getBoundsInLocal().getWidth() < 1) {hotRegion = this;if (hotRegion.getBoundsInLocal().getWidth() < 1) {stopAutoScrollIfNeeded(evt);return;}}double yOffset = 0;// y offsetdouble delta = evt.getSceneY() -hotRegion.localToScene(0, 0).getY();if (delta < proximity) {yOffset = -(proximity - delta);}delta = hotRegion.localToScene(0, 0).getY() +hotRegion.getHeight() -evt.getSceneY();if (delta < proximity) {yOffset = proximity - delta;}if (yOffset != 0) {autoscroll(yOffset);} else {stopAutoScrollIfNeeded(evt);}}private VirtualFlow<?> getVirtualFlow() {return (VirtualFlow<?>) lookup("VirtualFlow");}private Region getClippedContainer() {/** Safest way to find the clipped container. lookup() does not work at* all.*/for (Node child :getVirtualFlow().getChildrenUnmodifiable()) {if (child.getStyleClass().contains("clipped-container")) {return (Region) child;}}return null;}class ScrollThread extends Thread {private boolean running = true;private double yOffset;public ScrollThread() {super("Autoscrolling List View");setDaemon(true);}@Overridepublic void run() {/** Some initial delay, especially useful when* dragging something in from the outside.*/try {Thread.sleep(300);} catch (InterruptedException e1) {e1.printStackTrace();}while (running) {Platform.runLater(() -> {scrollY();});try {sleep(15);} catch (InterruptedException e) {e.printStackTrace();}}}private void scrollY() {VirtualFlow<?> flow = getVirtualFlow();flow.adjustPixels(yOffset);}public void stopRunning() {this.running = false;}public void setDelta(double yOffset) {this.yOffset = yOffset;}}private ScrollThread scrollThread;private void autoscroll(double yOffset) {if (scrollThread == null) {scrollThread = new ScrollThread();scrollThread.start();}scrollThread.setDelta(yOffset);}private void stopAutoScrollIfNeeded(DragEvent evt) {if (scrollThread != null) {scrollThread.stopRunning();scrollThread = null;}}
}

翻译自: https://www.javacodegeeks.com/2014/11/javafx-tip-15-listview-autoscrolling.html

JavaFX技巧15:ListView自动滚动相关推荐

  1. JavaFX技巧22:“自动调整大小(树)”表列

    JavaFX "缺少功能调查"中提到的"缺少功能"的第一件事就是能够自动调整表/树表中的列大小. 没错,没有公共API是正确的,但是当您密切关注时,您会注意到J ...

  2. android ListView 自动滚动到最底部

    android:stackFromBottom="true" android:transcriptMode="alwaysScroll" 只有一条信息是 是放在 ...

  3. 【原创】ListView快速滚动至新添加一行(自动滚动)

    在C#开发中我们经常要开发一些日志系统,尤其是基于ListView的日志显示系统. 但是当日志增多是你是否有一些困扰,就是它为什么不会自动滚动至最后一行. 以下是一小段代码,希望可以帮助你. publ ...

  4. android listview 向上自动滚动效果,Android通过代码控制ListView上下滚动的方法

    本文将介绍一种通过代码控制ListView上下滚动的方法. 先上图: 按下按钮会触发ListView滚动或停止. 实现该功能并不难,下面给出主要代码MainActivity.java package ...

  5. Flutter 小技巧之 ListView 和 PageView 的各种花式嵌套

    这次的 Flutter 小技巧是 ListView 和 PageView 的花式嵌套,不同 Scrollable 的嵌套冲突问题相信大家不会陌生,今天就通过 ListView 和 PageView 的 ...

  6. Acticity切换时ScrollView不停留原位置,自动滚动其他位置

    今天遇到了一个问题 前提:一个acitivity中是一个scrollview,里面包含很多组件,有的点击事件会拉起另外一个activity 现象:返回原activity时,scrollview没有停留 ...

  7. 网页视频15分钟自动暂停_在15分钟内学习网页爬取

    网页视频15分钟自动暂停 什么是网页抓取? (What is Web Scraping?) Web scraping, also known as web data extraction, is th ...

  8. 自定义灵活 自动滚动的Dialog

    效果图 一般的弹框很少显示列表数据的!这个是显示列表数据的Dialog弹框,如果显示的数据数超6条,就会自动滚动 喜欢就拿去用,下面直接上源码. 主页面MainActivity文件 import an ...

  9. jQuery在asp.net中实现图片自动滚动

    时间真快,不知不觉12月已经过了一半了,新的一年即将到来.有段时间没写东西了,技术这东东天天都在更新,天天都是一个新面孔,如果不坚持学习肯定就会落在队尾.要想跟上队伍,需要每天都要学习,但是学习的只是 ...

最新文章

  1. 深度学习在锦囊细选上的应用
  2. 正确理解hibernate的inverse属性
  3. C++ vector中的resize,reserve,size和capacity函数讲解
  4. U-Boot启动流程详解
  5. 使用自动伸缩组在AWS中运行安全数据库集群
  6. linux mysql5.6 主从配置,CentOS7+mysql5.6配置主从
  7. python创建角色_如何使用 Python 创建一名可操控的角色玩家
  8. python纳入小学课本了吗_Python语言为什么被推荐纳入高考和小学教材
  9. iframe导致的IE6下https页面安全提示
  10. SVN提交失败 can‘t open file‘\db\txn-current-lock’
  11. Git add回退 commit回退
  12. gamemaker学习笔记:打包Android过程记录
  13. JS返回上一页-JS返回下一页-JS页面跳转
  14. 薅资本主义羊毛新姿势,英伟达K80免费用
  15. 【毕业设计】基于单片机的火灾报警系统设计与实现 - 物联网 stm32
  16. 【项目管理】项目风险分析
  17. 替代Notepad++,可以试下notepad--,专门针对Notepad++替代而开发的简洁编辑器
  18. 重新认识构造函数、原型和原型链
  19. axure文件如何加密_Axure share APP使用教程——如何在手机上演示axure文件
  20. 50个Bootstrap扩展插件

热门文章

  1. Android public class MyApplication extends MultiDexApplication使用
  2. linux 无线网卡驱动桥转发,引用和完美转发
  3. java语言中的访问权限控制符有哪些,18.Java的访问控制符
  4. 对Servlet容器的补充
  5. jdk11 jdk12_JDK 12附带紧凑数字格式
  6. jdk 8 时区 转换_JDK 8 BigInteger精确缩小转换方法
  7. jvm运行时类加载机制_JVM体系结构:JVM类加载器和运行时数据区
  8. vue.jsr入门_JSR 365更新:深入CDI 2.0
  9. java文章上一篇下一篇_每个人都必须阅读的10篇Java文章
  10. ejb运行程序_在哪里可以运行EJB?