JavaFX ScrollPane 以编程方式移动视口 - 使内容居中

2023-11-23

我可以使用 setVvalue(double) 和 setHvalue(double) 方法在 JavaFX ScrollPane 中移动视口。我正在努力做的是根据其位置将特定节点置于滚动窗格内容的中心。我尝试过 localToScene() 和boundsInParent() 的各种组合。我读过(很多)并看到这个例子

如何滚动以使 ScrollPane 内容中的节点可见?

它很接近,但并不使对象居中,只是使它们可见。拥有内置的鼠标平移功能非常棒,但我对程序化平移感到很不舒服。

最终,我也需要能够进行缩放,因此我将实际形状放入一个组中,并将该组添加到滚动窗格内容中。我认为我应该对组进行缩放,并且我再次需要能够围绕组的中心进行缩放,以便我们回到操作和识别当前中心位置。任何可以提供的指示或示例将非常感激。上面链接中的代码示例是一个很好的 SSCCE。

提前致谢,

Andy


我将尝试在没有代码的情况下解释这一点,因为我认为这里没有必要。

让我们说content滚动窗格的高度h,视口的高度为v. If h = v,那么内容将完全适合视口,并且您不需要滚动条。在这种情况下(使用不可移动的滚动条),要使元素居中,需要将其放置在滚动窗格内容的中心。您无法通过滚动将其移动到视口的中心。

现在考虑h是两倍大小v (i.e. h = 2v)。在这种情况下,滚动窗格内容的上 1/4 和下 1/4 无法通过滚动居中。

(如果您绝对需要通过滚动来居中任何组件,您应该考虑填充内容窗格,但我们将在此处继续使用未填充的解决方案)

当你思考这个问题时,你会发现滚动条可能的滚动距离是h - v,您可以通过设置滚动该金额vvalue to 1.0.

使一个点居中y(这里点 y 是滚动窗格内容窗格的坐标)您可以使用以下 vvalue:

vvalue = (y - 0.5 * v) / (h - v) 

该表达式的分子是当 y 点在视口内居中时视口顶部显示的 y 坐标。分母是总的可滚动距离。

编辑:无论如何添加一些代码!

public void centerNodeInScrollPane(ScrollPane scrollPane, Node node) {
    double h = scrollPane.getContent().getBoundsInLocal().getHeight();
    double y = (node.getBoundsInParent().getMaxY() + 
                node.getBoundsInParent().getMinY()) / 2.0;
    double v = scrollPane.getViewportBounds().getHeight();
    scrollPane.setVvalue(scrollPane.getVmax() * ((y - 0.5 * v) / (h - v)));
}

(请注意,这假设该节点是滚动窗格内容窗格的直接子节点)

希望这可以帮助! :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX ScrollPane 以编程方式移动视口 - 使内容居中 的相关文章

随机推荐

  • 电路/方框图绘制

    我正在寻找用于 漂亮的 电路 框图绘制的算法或可视化工具 我也对这个问题的一般表述感兴趣 我所说的 电路绘图 是指利用 I O 端口及其连接 电线 探索框图 矩形 的位置和路线的能力 这些框图可以是分层的 即某些块可能具有一些嵌套的内部子结
  • 将 Word 文档文本转换为 HTML 的库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 是否有一个 Net开源库可以将word文档转换为HTML以在网页内显示 我知道有几种将 word 文档转换为 html 文件的工具 但我的要求是在
  • Rails 3.1 身份映射问题?

    有谁知道 Rails 3 1 IdentityMap 功能的关键问题导致默认情况下强制禁用该功能 我确信存在一些小具体问题 但是在为已构建的 Rails 3 1 应用程序启用它之前 是否有任何人应该注意的重大问题 来自代码中的注释 Acti
  • python-opencv AttributeError:“模块”对象没有属性“createBackgroundSubtractorGMG”

    我正在尝试遵循以下中给出的教程 https opencv python tutroals readthedocs org en latest py tutorials py video py bg subtraction py bg sub
  • 在 Mac OS 上设置 tkinter 图标

    我正在尝试更改 Mac OS 的 tk 应用程序上显示的图标 上次我检查此代码适用于 Windows 目标是使该解决方案能够跨所有平台工作 root tk Tk app Application master root app master
  • Clion 无法识别我的快速工具链路径

    我正在尝试为 swift 项目配置 clion 但它无法识别 swift 工具链路径 which swift 产生输出 usr bin swift bin swift 所以工具链就在那里 但 clion 只是不认识它 我该如何进行这项工作
  • jQuery 工具提示 onClick?

    我已经找了很长时间了 似乎找不到一个使用以下内容的 jQuery 工具提示插件 onClick 代替hover 使其像切换按钮一样工作 淡入淡出 使用工具提示的想法是 我有一些想要在其中显示内容的链接 虽然普通的工具提示 这可能是我出错的地
  • 如何在 Windows 上安装 pip?

    pip是替代品easy install 但我应该安装pip using easy install在 Windows 上 有没有更好的办法 Python 3 4 和 2 7 9 好消息 Python 3 4 2014 年 3 月发布 和Pyt
  • MySQL 表的主键是否应该公开?

    我有许多描述模型的 MySQL 表 例如 用户 业务 等 这些表的主键是否应该暴露给客户端 我主要是从安全角度来问 但是还有其他我没有想到的考虑因素吗 暴露您的主键 特别是如果它们是可预测的 是一个称为不安全直接对象引用的漏洞 通过使用如下
  • 如何设置 NSDate 上的时间?

    我想用我想要的小时 分钟 秒设置 NSDate 时间 目前我正在使用 NSDate 组件 但它没有给出期望的结果 comps setHour hours comps setMinute 0 comps setSecond 0 NSDate
  • 有人有 SourceForge 的 Xselerator XSL IDE 副本吗? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我多年来一直使用 Marrowsoft Xselera
  • 使用 python pandas 比较两个 csv 文件

    我有两个 csv 文件 均由两列组成 第一个具有产品 ID 第二个具有序列号 我需要查找第一个 csv 中的所有序列号 并在第二个 csv 上查找匹配项 结果报告将在单独的列中包含匹配的序列号以及每个 csv 中相应的产品 ID 我确实修改
  • ASP.NET MVC 4 C# HttpPostedFileBase,如何存储文件

    Model public partial class Assignment public Assignment this CourseAvailables new HashSet
  • 我可以使用 Boost.Asio 在多线程 I/O 服务上同步读取套接字并设置超时吗?

    我有一个使用 Boost Asio 进行 TCP 和 UDP 套接字通信的应用程序 我知道 Asio 中的 A 代表异步 因此该库致力于鼓励您尽可能使用异步 I O 我有一些情况 同步套接字读取更可取 但与此同时 我想为所述接收调用设置超时
  • created_at 字段有时会变成 nil

    I think created at总是设置为ActiveRecord创建记录的时间 但我发现有些记录是用null创建的created at 有什么条件可以导致这种情况吗 这些列created at updated at created o
  • 使用 google-rfc-2445 (iCalendar) 时,某些情况下会返回开始日期

    我运行了很多 RRULE 只是为了测试性能谷歌 rfc 2445 Java 实现IETF RFC 2445 日历 我发现在某些情况下我在方法的返回列表中得到了开始日期 测试非常简单 private static void runGoogle
  • ReactJS中如何处理多选表单

    我尝试处理一个多种表单选择选项 在 ReactJS 中 我试图激发 javascript 经典代码的灵感来处理这个问题 但我失败了 我的代码只是不向我发送所选的值 怎么处理呢 这是我的代码 class ChooseYourCharacter
  • 如何在 ExtJS 4 中实现流程布局?

    我想使用一种布局 其中组件像 hbox 一样水平添加 但在添加时 如果组件超出容器的边界 则会移动到下一行 这与swing和flex中的FlowLayout类似 我在 ExtJS 4 0 中找不到任何可以实现此目的的布局 所以我想知道我将如
  • 如何使两个函数参数隐式

    假设我们有一个以函数作为参数的对象apply method object Wrapper def apply block TypeA gt String TypeA a block a TypeA是应用程序的域类型 现在 当我定义内联块时
  • JavaFX ScrollPane 以编程方式移动视口 - 使内容居中

    我可以使用 setVvalue double 和 setHvalue double 方法在 JavaFX ScrollPane 中移动视口 我正在努力做的是根据其位置将特定节点置于滚动窗格内容的中心 我尝试过 localToScene 和b