JavaFX技巧30:带有DropShadow的ScrollPane

最近,在我的一个项目中,我发现用户很难看到ScrollPane实例的内容当前是否已滚动。 一种更清晰的方法是在滚动窗格的顶部添加阴影。

这也是Google的Material Design建议的。 所以我尝试了一下。 在我的解决方案中,我只是向ScrollPane添加了一个区域,并在对其进行布局时将其移出ScrollPane的视口边界,因此只有应用于该区域的阴影效果仍可以到达该区域。

为了真正确保该区域不可见,我还必须在ScrollPane上设置一个剪辑。 尽管我必须承认我不是100%确信这是实现此目标的最佳方法,但它的效果很好。 因此,如果有人有任何建议/替代方法,请发表评论。

在下面您将看到滚动我们应用程序屏幕之一的屏幕截图之前和之后的内容。

滚动之前

滚动前使用ScrollPane

滚动后

带有阴影的ScrollPane

顺便说一句:我实现了这种方式,使阴影不会突然出现,而是逐步移入视口,具体取决于用户滚动了多远。 要查看此内容,您需要非常缓慢地向下滚动。

ShadowScrollPane的代码可以在GitHub的以下要点中找到:

package uk.co.senapt.desktop.shell;import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.Region;
import javafx.scene.shape.Rectangle;/*** Created by lemmi on 23.08.17.*/
public class ShadowScrollPane extends ScrollPane {private Region shadow = new Region();public ShadowScrollPane() {super();init();}public ShadowScrollPane(Node content) {super(content);init();}private void init() {skinProperty().addListener(it -> {getChildren().addAll(shadow);});setFitToWidth(true);setVbarPolicy(ScrollBarPolicy.NEVER);setHbarPolicy(ScrollBarPolicy.NEVER);shadow.setManaged(false);shadow.setStyle("-fx-pref-height: 10;" +"-fx-background-color: black;" +"-fx-effect: dropshadow(gaussian, rgba(0, 0, 0, .75), 20, 0.19, 0, 6);");shadow.getStyleClass().add("shadow");shadow.visibleProperty().bind(showShadowProperty());shadow.setMouseTransparent(true);shadow.visibleProperty().bind(vvalueProperty().greaterThan(0));Rectangle clip = new Rectangle();clip.widthProperty().bind(widthProperty());clip.heightProperty().bind(heightProperty());setClip(clip);vvalueProperty().addListener(it -> {if (lastOffset != computeOffset()) {requestLayout();}});showShadowProperty().addListener(it -> requestLayout());}private final BooleanProperty showShadow = new SimpleBooleanProperty(this, "showShadow", true);public final BooleanProperty showShadowProperty() {return showShadow;}public final boolean isShowShadow() {return showShadow.get();}public final void setShowShadow(boolean show) {showShadow.set(show);}private final int SHADOW_HEIGHT = 30;@Overrideprotected void layoutChildren() {super.layoutChildren();if (isShowShadow()) {Insets insets = getInsets();double w = getWidth();double offset = computeOffset();shadow.resizeRelocate(-10, insets.getTop() - shadow.prefHeight(-1) - SHADOW_HEIGHT + offset, w + 20, shadow.prefHeight(-1) - 1);lastOffset = offset;}}private double lastOffset = 0;private double computeOffset() {if (getContent() != null) {return Math.min(getVvalue() * getContent().prefHeight(-1), SHADOW_HEIGHT);}return 0;}
}

翻译自: https://www.javacodegeeks.com/2018/06/javafx-scrollpane-dropshadow.html

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

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

相关文章

【有限域除法】二元多项式除法电路原理及MATLAB详解

关注公号【逆向通信猿】试读更多内容!!! 二元多项式除法电路原理 例: g ( x ) = x 4 + x 2 + x + 1 g(x)=x^4 + x^2+x+1

Spring Apache Kafka教程

在本SpringApache Kafka课程中,我们将学习如何在Spring Boot项目中开始使用Apache Kafka,并开始生成和使用我们所选主题的消息。 除了一个简单的项目外,我们还将深入探讨Kafka的术语以及分区概念在Kafka中的工作方式。 让我们开始吧。 1.简介…

【OFDM系列3】AWGN下基于循环前缀(CP)OFDM调制解调原理、信噪比计算及仿真(H Harada经典OFDM书籍中代码详解及更正)

一、OFDM调制技术发展 在无线传输系统中,如果传输信号的带宽大于信道的相干带宽,信道为频率选择性信道,这会带来严重的码间串扰,极大的影响系统的传输性能。在研究对抗多径衰落的过程中,多载波并行传输体制逐渐受到人们的重视。并行传输是将高速数据分成若干路低速数据,…

【有限域生成】本原多项式生成有限域的原理及MATLAB实现

关注公号【逆向通信猿】更精彩!!! GF ⁡ ( 2 r ) \operatorname {GF}(2^r) GF(2

adf4351使用方法_ADF:使用HTTP POST方法进行URL任务流调用

adf4351使用方法众所周知,可以通过某些URL直接从浏览器或某些外部应用程序调用有限任务流。 如果任务流的属性“ URL invoke”设置为“ URL-invoke-allowed”,则启用此功能,该功能通常在集成项目中使用。 通常,客户端(…

【BCH码1】系统BCH码编码原理及MATLAB实现(不使用MATLAB库函数)

关注公号【逆向通信猿】更精彩!!! BCH编码原理 设一个 ( n , k ) (n,k) (n,k)循环码的生成多项式为 g

【定时同步系列2】16QAM调制+OM定时+信号分段处理+误码率曲线之MATLAB仿真(复信号模型)

关注公号【逆向通信猿】阅读更多内容!!! 算法回顾 关于O&M算法的原理、公式推导与详解,请参考博客: 【定时同步系列1】定时同步之MARTIN OERDER算法原理与公式推导 鉴于前期有很多读者私信博主O&M算法的MATLAB仿真过程,前期太忙没来得及做。终于抽得一日闲,可…

使用Stream.peek在Java Streams内部进行窥视

对于刚接触JDK 8的管道和流的Java开发人员而言, Stream接口提供的peek(Consumer)方法可以用作可视化流操作行为的有用工具。 即使是更熟悉Java流和聚合操作的Java开发人员,有时也会发现Stream.peek(Consumer&#xff0…

【定时同步系列3】8PSK调制+OM定时+信号分段处理+误码率曲线之MATLAB仿真(实信号模型)

关注公号【逆向通信猿】更精彩!!! 仿真结果 对于8PSK调制,仿真结果如下: 误码率曲线图 假设 E b / n 0 = 14 d B Eb/n_0 = 14dB

借助Web技术,桌面用户界面将保持活跃

要了解Java桌面应用程序有什么问题,让我们看一下JavaFX(桌面应用程序的领先UI框架)的新功能。 很明显,它正在向Web方法发展,从Web世界中借用了越来越多的功能。 JavaFX支持一部分CSS功能,并附带其自己的属性…

Win10窗口侧边栏设置Win7模式

本人非常不喜欢Win10的几个系统功能 贴靠窗口时自动调整窗口大小,填满可用空间关将窗口对齐时,显示能够在其旁边对齐的内容当我调整某个贴靠窗口的大小时,也调整任何相邻贴靠窗口的大小 想调整成Win7那种模式和风格的话,设置如下…

VS2017无法打开文件MSVCRTD.lib

需要添加组件,如下图

groovy 2.5.4_Java 7 vs Groovy 2.1性能比较

groovy 2.5.4自从我与Grails上一次接触以来,我已经有两年没有使用Groovy了。 我陷入(硬)核心企业Java中,但在后台遇到了一些性能方面的问题。 我几乎错过了学习Spock的机会,但是幸运的是, 华沙Java用户组帮…

【定时同步系列4】QPSK调制+OM定时(FFT实现及频域补偿)+信号分段处理+误码率曲线之MATLAB仿真(复信号模型)

关注公号【逆向通信猿】更精彩!!! 仿真结果 对于QPSK调制,仿真结果如下: **分析:**可以看出,补偿前的定时相位约为-0.1,补偿后的相位在0附近波动,但由于没有进行环路滤波(可采用卡尔曼滤波器),所以波动很大,这也导致了后续解调结果不理想,实际中必须加入滤波器…

Java 10迁移建议

你好,再一次到另一个热点。 我的名字是Java Champions平台工程师兼DevOps专家Peter Pilgrim。 如您所知,Java 9引入了模块系统。 您可能正在将服务迁移到JDK 10或更高版本,或者至少在考虑中。 我对企业的一般建议是,您越早迁移&a…

《调制解调算法》专栏导航贴

关注公号【逆向通信猿】更精彩!!! 通信方面有关信号处理算法的MATLAB仿真,包含博主的一些宝贵经验,不定期更新!!! 本系列博克力求从简到繁,无论是刚接触通信的小白&…

Office系列完全干净卸载工具合集(最全)

使用 Microsoft Fix it 卸载 Microsoft Office 套件 一、Windows 7、Windows Vista或Windows XP下卸载Office 1.MicrosoftEasyFix50416 工具用来卸载office 2003 MicrosoftEasyFix50416_Office2003.msi 2.MicrosoftEasyFix50154 工具用来卸载office 2007 MicrosoftEasyFix50…

谓词::不适合Java

Jim Laskey在OpenJDK core-libs-dev邮件列表上最近的消息“ RFR:CSR – JDK-8203428 Predicate :: not ”指出了JDK Bug JDK-8203428 [“ Predicate :: not”]。 JDK-8203428的“摘要”指出:“引入新的静态方法Predicate :: not,这将使开发人…

缓冲区溢出漏洞攻击之用户登录

登录程序模拟 在以下程序中,可以使用三种不同的方法检查用户输入的账号和密码是否与存储的用户名和密码匹配。通过编译生成可执行文件,并对其进行测试。该程序会将用户输入的账号、密码与名为password.txt的文件中的账号、密码进行比对,如果二者匹配,则授予访问权限。而实…

【锁相环系列1】锁相环的基本原理

关注公号【逆向通信猿】更精彩!!! 基本概念 相位同步 指两个信号的频率相等,相位差为一个固定值。当 ω i = ω 0 \omega_i=\omega_0 ω