JavaFX技巧15:ListView自动滚动

我最近不得不为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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Direct3D学习_绘制

运行了示例&#xff0c;重要步骤记录如下&#xff1a; 1&#xff1a;创建顶点和索引缓存 IDirect3DDevice9::CreateVertexBuffer IDirect3DDevice9::CreateIndexBuffer 2&#xff1a;填充数据 lock ........ unlock 3&#xff1a;设置摄像机 D3DXVECTOR3 position(x,y,z);   …

JZTK项目 驾照题库项目servlet层得到的json字符串在浏览器中 汉字部分出现问号?无法正常显示的解决方法

servlet层中的代码如下&#xff1a; package com.swift.jztk.servlet;import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletReque…

【RTOS】基于V7开发板的uCOS-III,uCOS-II,RTX4,RTX5,FreeRTOS原版和带CMSIS-RTOS V2封装层版全部集齐...

RTOS模板制作好后&#xff0c;后面堆各种中间件就方便了。 1、基于V7开发板的最新版uCOS-II V2.92.16程序模板&#xff0c;含MDK和IAR&#xff0c;支持uC/Probehttps://www.cnblogs.com/armfly/p/11255981.html 2、基于V7开发板的最新版uCOS-III V3.07.03程序模板&#xff0c;含…

三极管开关电路设计(转)

三极管开关电路设计 三极管除了可以当做交流信号放大器之外&#xff0c;也可以做为开关之用。严格说起来&#xff0c;三极管与一般的机械接点式开关在动作上并不完全相同&#xff0c;但是它却具有一些机械式开关所没有的特点。图1所示&#xff0c;即为三极管电子开关的基本电路…

poj3009

样例和网上找的测试数据 都过了 还是 wa program poj3009;type starecord x,y:integer; end;var dir:array[1..4,1..2]of integer((1,0),(-1,0),(0,1),(0,-1)); w,h,ans,ansb:integer; map:array[0..21,0..21]of integer; start:sta; flag:boolean; procedur…

大小端测试程序

//大小端测试程序#include <stdio.h>#include <stdlib.h>voidcheckCPUendian();intmain(){ checkCPUendian();return0;}voidcheckCPUendian(){ union{ unsigned inti; unsigned chars[4]; }c; c.i 0x12345678; printf("%s\n", (0x12c.s[0]) ?"大端…

OpenShift上具有NetBeans的Java EE

今天是慕尼黑的NetBeans日 。 我很高兴提出一个关于将Red Hat产品与我著名的IDE集成的会议。 因此&#xff0c;我一直在谈论WildFly &#xff0c; EAP &#xff0c;Git和OpenShift Online&#xff0c;并展示了使用该工具集优化开发工作流程的所有不同方式。 大约有100位与会者…

tomcat.apache startup.bat闪退两种解决方法

tomcat bin文件夹中的startup.bat闪退原因及解决方法两种 方法一&#xff1a;在启动tomcat时闪退&#xff0c;重新检查java的jre运行环境。如果环境变量忘记配置一定会导致了tomcat的闪退。 追加 Apache的bin的环境变量也放到path中 注意检查一下看 JAVA_HOME是否写错&#xff…

产生的DLL (VS2005, MATLAB7.5, mwArray)

from: http://www.simwe.com/forum/thread-801187-1-1.html 程序中使用MATLAB编译产生的DLL &#xff08;VS2005, MATLAB7.5, mwArray&#xff09; 最近有几个帖子都在讨论有关在C程序中使用MATLAB编译产生的动态链接库DLL。本 来想用原来帖子中给出的m代码作为例子&#xff0c…

构建和测试JSF.next

JSF 2.3专家组正在努力确定哪些功能将成为即将发布的版本的一部分。 JSF团队一直在努力改善CDI的一致性。 JSF 2.3代码库中已经有许多新功能可以开始测试。 我将尝试使本文保持最新状态&#xff0c;并添加最新功能。 有关最新参考&#xff0c;请参阅Manfred的博客。 要参考Manf…

启动LINUX下的TFTP服务器

第一步: 我们要确认,LINUX下是不是安装了TFTP-SERVER. 在LINUX下输入: rpm -q tftp-server 如出现如下回复: tftp-server-0.39-2 则表示tftp-server已安装. 第二步: 修改TFTP启动脚本: 方法一: 需要修改ftptpd的启动脚本vi /etc/xinetd.d/tftp加上 disable no 此时即可启动tf…

npm 常用指令

npm install <name>安装nodejs的依赖包 例如npm install express 就会默认安装express的最新版本&#xff0c;也可以通过在后面加版本号的方式安装指定版本&#xff0c;如npm install express3.0.6 npm install <name> -g 将包安装到全局环境中 对应的的是 pac…

简单代码生成器原理剖析(一)

上篇文章&#xff08;深入浅出三层架构&#xff09;分析了简单三层架构的实现。包括Model,DAL&#xff08;数据访问层&#xff09;,BLL&#xff08;业务逻辑层&#xff09;的实现。 实际开发中&#xff0c;由于重复代码的操作&#xff0c;会花费大量时间&#xff0c;如果以代码…

Qt学习之路(4):初探信号槽

看过了简单的Hello, world! 之后&#xff0c;下面来看看Qt最引以为豪的信号槽机制&#xff01;所谓信号槽&#xff0c;简单来说&#xff0c;就像是插销一样&#xff1a;一个插头和一个插座。怎么说呢&#xff1f;当某种事件发生之后&#xff0c;比如&#xff0c;点击了一下鼠标…

当字符串为空但不为空时

介绍 我团队中的一名初级程序员遇到了一个有趣的错误。 我已经不止一次看到它的症状。 这篇文章是寻找什么以及将来如何防止它。 我还将探讨该问题的不同解决方案。 病征 有问题的代码看起来做得不错。&#xff1a; if(trouble ! null && !trouble.isEmpty()) { Syst…

注解的力量 -----Spring 2.5 JPA hibernate 使用方法的点滴整理(六): 一些常用的数据库 注解...

一、 实体 Bean 每个持久化POJO类都是一个实体Bean, 通过在类的定义中使用 Entity 注解来进行声明。 声明实体Bean Entitypublic class Flight implements Serializable { Long id; Id public Long getId() { return id; } public void setId(Long id) { this.id id; }} E…

SWT鼠标单击实现

最近&#xff0c;我做了一些SWT定制小部件的开发&#xff0c;偶然发现了一个问题&#xff0c; 为什么没有默认的SWT鼠标单击侦听器&#xff1f; 由于这个主题有时会提出&#xff0c;所以我认为写一两句话来说明背后的理性基础以及如何实现鼠标单击通常不会受到伤害。 SWT鼠标请…

第三周进度总结

本周大部分时间花费在了考驾照上&#xff0c;所以没有在学习上用太多的时间。在不多的时间里看完了老师推荐的《大道至简》这本书&#xff0c;从书中学到了很多编程方面的思想&#xff0c;受益匪浅。还完成了2个代码的编译&#xff0c;一个是判断AB和C的关系&#xff0c;这个并…

页面中插入视频的方法---video/embed/iframe总结

1. video标签 当前主流的方法当然是HTML5中的video标签了&#xff0c;但是 当前&#xff0c;video 元素只支持三种视频格式&#xff1a; Ogg 带有 Theora 视频编码和 Vorbis 音频编码的 Ogg 文件 MPEG4 带有 H.264 视频编码和 AAC 音频编码的 MPEG 4 文件 WebM 带有 VP…

Spring请求级备忘录

介绍 记忆化是一种方法级别的缓存技术&#xff0c;用于加快连续调用的速度。 这篇文章将演示如何仅使用Spring AOP实现任何数据源的请求级可重复读取。 Spring缓存 Spring提供了非常有用的缓存抽象 &#xff0c;允许您将应用程序逻辑与缓存实现细节分离。 Spring Caching使用…