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

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

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

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

滚动之前

滚动后

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

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

JavaFX技巧30:带有DropShadow的ScrollPane相关推荐

  1. javafx如何带菜单_JavaFX技巧30:带有DropShadow的ScrollPane

    javafx如何带菜单 最近,在我的一个项目中,我发现用户很难看到ScrollPane实例的内容当前是否已滚动. 一种更清晰的方法是在滚动窗格的顶部添加阴影. 这也是Google的Material D ...

  2. JavaFX技巧来节省内存! 属性和可观察物的阴影场

    在 JavaFX的世界中, Properties API允许UI开发人员将值绑定到UI控件. 这种功能非常容易,但是当对象模型经常使用属性时,应用程序可能会很快耗尽内存. 我通常会编写两个单独的对象, ...

  3. ProE 应用技巧30则

    2006-04-19 08:11:49 ProE 应用技巧30则 作者:snapspgk11 出处:snapspgk11 1.将PRO/E的图形放到word文档里 方法一:先在Pro/E中在线框模式( ...

  4. JavaFX技巧17:带有AnchorPane的动画工作台布局

    最近,我不得不为应用程序实现一个布局,其中可以根据用户是否登录来隐藏或通过滑入/滑出动画显示或显示菜单区域和状态区域. 以下视频显示了实际的布局: 在过去,我可能会使用自定义控件和自定义布局代码来实现 ...

  5. JavaFX技巧32:需要图标吗? 使用Ikonli!

    动机 自2013年以来,我一直在编写JavaFX应用程序和库的代码,它们的共同点是,我需要找到可以用于它们的良好图标/图形. 作为前Swing开发人员,我首先使用图像文件,GIF或PNG. 通常,我会 ...

  6. JavaFX技巧29:使布局忽略不可见的节点

    在我仍在Swing中实现UI的时候,我曾经是MigLayout的忠实拥护者("一个布局管理者来统治所有这些,对吗Mikael?"). 我真正喜欢的功能之一是当组件不可见时可以定义不 ...

  7. JavaFX技巧20:有很多需要展示的地方吗? 使用画布!

    JavaFX应用程序似乎有两种:第一种使用带有节点和CSS样式的场景图,第二种使用单个画布. 但是,将这两种方法混合使用是完全合法的. 尤其是当您的应用程序必须显示大量详细信息时,您很容易最终创建成千 ...

  8. JavaFX技巧6:使用透明颜色

    为用户界面元素选择正确的颜色始终是一个很大的挑战,但是当您开发可重用的框架控件时,开发人员就无法控制使用它们的应用程序的外观和感觉,这甚至更具挑战性. 尽管您可能总是将元素添加到默认的灰色背景之上,但 ...

  9. html教程技巧,HTML教程——必须知道的技巧30例

    1. 链接控制 返回前页:使用OnClick="history.go(-1)",如 返回主页:使用OnClick='top.location.href="../china ...

最新文章

  1. Cxf + Spring3.0 入门开发WebService
  2. python解一元二次方程步骤-使用Python解一元二次方程!
  3. 如何保证redis数据都是热点数据
  4. 中判断字符串是否为空_自己动手编写VBA代码,判断一个工作表是否为空,然后删除它...
  5. python软件下载3版本-Python软件下载-Python最新版 v3.7.3 - 动力软件园
  6. tensorflow之truncated_normal
  7. php中的exception与自定义异常类
  8. JavaScript详细教程归纳
  9. Python贪吃蛇小游戏
  10. 软件测试工程师简历项目经验怎么写?1000套简历模板告诉你答案
  11. java中负数_Java中负数以及类型转换问题
  12. html三角形正方形代码,用CSS画三角形,纯CSS绘制三角形的代码
  13. is 简写 缩写_为什么e.g.是for example的缩写?它和i.e.是什么关系?
  14. MSP430之仿真器驱动安装问题
  15. 《计算机网络》第7版——知识摘要总结
  16. 配置安装Apache主服务发生错误:(OS 5)拒绝访问。 : AH00369: Failed to open the Windows service manager, perh······
  17. python爬虫微博24小时热搜_Python爬虫之微博热搜
  18. apple pay集成_如何将Google Pay集成到您现有的Android应用中
  19. Java JNA (二)—— dll回调函数实现
  20. HTML 列表标签、有序列表、无序列表、自定义列表dl dt dd

热门文章

  1. Sentinel(二十三)之使用Apollo存储规则
  2. 程序员如何写简历?来自硅谷的八条建议
  3. Oracle入门(三)之连接与登录
  4. 设计模式之静态代理模式实战
  5. C++描述 国王给骑士发放金币 ||
  6. 初识Windows程序
  7. RPC(远程过程调用)
  8. 蓝桥杯JAVA省赛2013-----B------2(马虎算式)
  9. 遍历HashMap的四种方法
  10. tp中怎么执行mysql事务_tp中使用事务