JavaFX 中具有自动拉伸图块的 TilePane

2023-11-22

JavaFX 有没有办法充分利用 TilePane 或 FlowPaneand网格窗格?
这是我想要实现的目标:

首先,我喜欢 GridPane 的想法,我可以在其中设置一个 M×N 网格,该网格会在其父容器内自动调整大小,以将空间平均划分为 M 列和 N 行。然后我可以放置一些完全填充每个单元格的子元素,它们将沿着网格拉伸。这很酷。
但有一个缺点:我需要通过设置其行号和列号来明确指定每个控件的位置。

然后,还有诸如 FlowPane 或 TilePane 之类的布局容器,当父容器更改其大小时,它们会自动重排其子元素。当我添加另一个子元素时,它会自动附加到列表的末尾,并且当空间太少而无法容纳另一个元素时,元素列表在到达容器边缘后会自动换行。
但这也有一个缺点:子元素只能具有严格的预定义大小。它们不会随其父元素一起拉伸。

这就是我需要的:
我需要这两个容器的最佳性能,也就是说,我想要一个 M × N 网格(比方说 4×4),其中每个单元格的父宽度/M × 父高度/N 并沿着窗口延伸,以便它始终4×4 个单元格,但它们的大小(及其内容的大小)会相应地拉伸。 但我不想明确告诉容器将我添加的每个新子项放在哪一行和哪一列中。相反,我只想添加它,并让容器找出要放入的第一个空单元格,从左到右填充单元格,如果当前行中没有空单元格,则从上到下填充单元格。

这些预定义容器的属性是否有一些神奇的设置可以让我实现这一目标?还是我需要自己写一个这样的容器?


正是出于您所描述的目的,我创建了ButtonGridPane。这是初稿,还有改进的空间,但也许它可以给你一个基本的想法。

public class ButtonGrid extends Pane {

    private static final double DEFAULT_RATIO = 0.618033987;

    private int                 columnCount;
    private double              ratio;

    public ButtonGrid(int columnCount) {
        this(columnCount, DEFAULT_RATIO);
    }

    public ButtonGrid(int columnCount, double heightToWidthRatio) {
        getStyleClass().add("button-grid");
        this.columnCount = columnCount;
        ratio = heightToWidthRatio;
    }

    public void setColumnCount(int columnCount) {
        this.columnCount = columnCount;
    }

    public void setHeightToWidthRatio(double ratio) {
        this.ratio = ratio;
    }

    @Override
    public Orientation getContentBias() {
        return Orientation.HORIZONTAL;
    }

    @Override
    protected void layoutChildren() {
        double left = getInsets().getLeft();
        double top = getInsets().getTop();

        double tileWidth = calculateTileWidth(getWidth());
        double tileHeight = calculateTileHeight(getWidth());

        ObservableList<Node> children = getChildren();
        double currentX = left;
        double currentY = top;
        for (int idx = 0; idx < children.size(); idx++) {
            if (idx > 0 && idx % columnCount == 0) {
                currentX = left;
                currentY = currentY + tileHeight;
            }
            children.get(idx).resize(tileWidth, tileHeight);
            children.get(idx).relocate(currentX, currentY);
            currentX = currentX + tileWidth;
        }
    }

    @Override
    protected double computePrefWidth(double height) {
        double w = 0;
        for (int idx = 0; idx < columnCount; idx++) {
            Node node = getChildren().get(idx);
            w += node.prefWidth(-1);
        }
        return getInsets().getLeft() + w + getInsets().getRight();
    }

    @Override
    protected double computePrefHeight(double width) {
        double h = calculateTileHeight(width) * getRowCount();
        return getInsets().getTop() + h + getInsets().getBottom();
    }

    private double calculateTileHeight(double width) {
        return calculateTileWidth(width) * ratio;
    }

    private double calculateTileWidth(double width) {
        return (-getInsets().getLeft() + width - getInsets().getRight()) / columnCount;
    }

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

JavaFX 中具有自动拉伸图块的 TilePane 的相关文章

  • Exposé 布局算法

    我正在制作一些项目 其布局类似于 Mac OS X 在 Expos 中对窗口所做的操作 它适应项目的长宽比和可用区域的长宽比 基本上 可用区域分为行和列 每个单元格 行和列的交集 中放置一个项目 这些项目必须保持其纵横比 此处width h
  • 我可以为 Android Activity 分配“默认”OnClickListener() 吗?

    我有一个 Activity 对于布局中的每个小部件 我调用 setOnClickListener 来分配我的 OnClick 处理程序 在我的 OnClick 处理程序中 我使用 switch 语句根据 View 参数的 ID 为每个按钮执
  • Android布局中如何实现Button的自动宽度

    我有几个垂直列出的按钮 我需要它们都具有相同的宽度 而且还要显示其中的所有文本 基本上我需要所有它们的宽度作为最大的宽度的包裹宽度 希望我解释得很好 现在 我已经有一种布局可以在我的 Samsung Galaxy S2 4 1 2 上运行
  • 确定 JavaFX 中是否消耗了事件

    我正在尝试使用 JavaFX 中的事件处理来做一些非滑雪道的事情 我需要能够确定手动触发事件后是否已消耗该事件 在以下示例中 正确接收了合成鼠标事件 但调用 Consumer 不会更新该事件 我对此进行了调试 发现 JavaFX 实际上创建
  • 使用 dpi 与 dp 缩放图像之间的差异

    我拥有所有由九个补丁位图组成的 dpi 可绘制目录 xxhdpi 和 xxxhdpi 是否必要 可绘制目录中的可绘制资源文件可检索所有缩放的位图 并且我使用可绘制资源文件 现在 我的问题是我还根据大小 小 正常等 创建了 缩放 布局目录 其
  • 使用多个值过滤 JFX TableView

    我目前正在尝试过滤我的数据TableView using FilteredList with predicate 我有2个ComboBoxes来过滤值 我的表包含Result Each Result has a Student that S
  • Android - 保存动态更改布局的状态

    我有一个布局 用户可以在其中添加按钮并将其放置在他们想要的位置 我想允许用户保存他们的布局 以便下次打开应用程序时加载它 有谁知道我是否可以将文件保存到 SD 卡上 或者 我可以使用某种layout getXml 方法并将其放入我的应用程序
  • minHeight 有什么作用吗?

    在附图中 我希望按钮列与图像的高度相匹配 但我也希望按钮列有一个最小高度 它正确匹配图像的高度 但不遵守 minHeight 并且会使按钮向下滑动 我正在为按钮列设置这些属性
  • 如何防止布局的方向改变,而不是整个屏幕/活动的方向改变

    我需要一个子布局 可以是任何布局 例如FrameLayout or RelativeLayout 忽略方向变化并始终保持横向 但不是它的父级或任何其他兄弟布局 视图 它们应该相应地改变它们的方向 因此 我不能使用setRequestedOr
  • 为什么 JavaFX API 不包含在 Java 8 J2SE 中? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有谁知道为什么 JavaFX 8 仍然不是即将推出的 Java 8 中的日常 J2SE API 显示所有 Java 组件的技术图清楚地将 Jav
  • Java NoSuchMethodException - 类中确实存在方法

    我正在构建一个 JavaFx 应用程序 我想创建一个接收 GridPane 和 Node 以及添加到窗格中的项目数量的方法 但是 当我调用该方法时 我收到 NoSuchMethodException 作为测试 我尝试创建一个简单的方法pri
  • 将片段部分移出屏幕

    我已经被这个问题难住有一段时间了 我试图将包含在 FrameLayout 中的片段向右移动 以便只有片段的左侧 20 可见 我认为我遇到的问题是父级不会让片段移出其边界 或者我不知道如何移动它 我所尝试的一切只是将片段推到右墙上 然后缩放片
  • javafx组合框下拉菜单从屏幕边缘跳出

    我有最新版本的 java 8 40 和 javaFX 我有一个包含 10 个项目的复选框 我编译并运行该程序 如果我将程序窗口移至监视器屏幕的底部 下拉列表将从监视器屏幕中消失 无法将项目点击出屏幕 相反 如果我尝试使用场景生成器 2 0
  • 如何在android中显示对话框之外的图像?

    我试图在对话框片段的顶部显示配置文件图像 一半在图像之外 我在下面附加了示例对话框 就像那样 并尝试了旧 Stackoverflow 解决方案中的所有 FrameLayout 协作 但我无法存档此内容 请给我正确的解决方案 谢谢 Updat
  • CSS 网格/布局框架,专注于固定元素和单页全屏布局

    经验法则 如果您在布局中过多地使用 CSS 请切换到框架 我已经研究了数十个网格 布局框架 其中大多数都专注于传统的文档网格布局 我的页面更像是一个 SPA 单页应用程序 它类似于桌面应用程序使用的布局 显然 HTML 不能很好地处理这个问
  • JAVAFX 缩放、ScrollPane 滚动

    I have JAVAFX application with zoom and scale as described here Scale at pivot point in an already scaled node https sta
  • 根据子节点数量动态调整 d3 树布局的大小

    从这个例子来看http mbostock github com d3 talk 20111018 tree html http mbostock github com d3 talk 20111018 tree html我已经建立了一个d3
  • 复选框选择与 TableView 绑定

    How to bind with TableView selection model with checkbox isSelected in table view In manually using mouse multiple selec
  • Android Studio图形界面中的ViewFlipper切换?

    感谢您抽出时间并在有时间的情况下回答我的问题 我对 Android 编程相当陌生 所以任何帮助都很棒 我正在使用 Android Studio 并且编写了一个包含多个布局的 XML 布局 我可以在使用 ViewFlipper showNex
  • Kivy - 文本换行工作错误

    我正在尝试在 Kivy 1 8 0 应用程序中换行文本 当没有太多文字时 一切正常 但如果文本很长并且窗口不是很大 它只是剪切文本 这是示例代码 vbox BoxLayout orientation vertical size hint y

随机推荐

  • django 2 中的迁移错误; AttributeError:“str”对象没有属性“decode”

    我正在我新建的名为 core 的应用程序上运行迁移 当我在其上运行迁移时 我收到一个错误 告诉我这一点 query query decode errors replace AttributeError str object has no a
  • LXML:无法导入 etree

    我访问此页面并下载了 tar 文件 http pypi python org pypi lxml 2 3 4 downloads 然后 我将 lxml 文件夹复制到我的 Python26 Lib 文件夹中 现在 当我走向口译员并输入from
  • 使用 RESTlet 进行细粒度身份验证

    我想使用带有细粒度身份验证的 RESTlet 公开资源 我的ServerResource应该可以通过访问GET仅适用于经过身份验证的会员 使用基本身份验证 但是 请求使用POST无需任何身份验证的呼叫者也应该可以使用 为了澄清 http 路
  • 在WebKit/Chrome中使用XHR上传二进制字符串(相当于Firefox的sendAsBinary)

    我正在开发一个使用多个尖端 WebKit 功能的 Web 应用程序 它本质上是这样做的 读取本地文件FileReader 使用 JavaScript 解压缩库将每个文件解压缩为字符串 并使用 XMLHttpRequest POST 每个文件
  • Google AppEngine:自定义身份验证

    我可以使用 Google 帐户在 AppEngine 中验证我的用户的方式简直太棒了 但是 我需要使用我的自定义认证登录系统 我将有一个 AppUsers 表 其中包含用户名和加密密码 我在 gae 上读到了一些有关会话的内容 但我需要帮助
  • 使div的高度随着其内容而扩展

    我有这些嵌套的 div 我需要主容器扩展 高度 以容纳内部的 DIV
  • 错误的ELF类:ELFCLASS32(可能原因:架构字宽不匹配)

    我有一个奇怪的异常 说 ELF 类错误 但包装器设置正确 要使用比利时身份证发行商官方网站上的 SDK 读取比利时身份证 http eid belgium be en binaries beid sdk 3 5 3 ubuntu 9 10
  • django 中的分页 - 原始查询字符串丢失

    我使用文档中的代码对数据进行分页 try data paginator page request GET get page except PageNotAnInteger page 1 data paginator page 1 excep
  • 锥体图像细化

    为了制作一个漂亮的与平面相交的圆锥体三维图形 我选择对 Mathematica 中的现有方法 即 S Mangano 和 S Wagon 的书籍 进行轻微的重新排列 下面的代码假定显示所谓的丹德林结构 内球体和外球体与圆锥体内部相切 并且与
  • 如何在 javascript 中使用 python 变量?

    我一直在寻找一种使用 selenium 的网络驱动程序访问不可见文本字段的方法 我让它工作的唯一方法是使用 driver execute script document getElementById text field value XYZ
  • Stringify 一级宏展开 C

    是否可以将此 C 宏字符串化 define GPIO INT PIN GPIO PORT D GPIO PIN IRQ RISING GPIO PIN5 使用类似的东西 MY STRINGFY GPIO INT PIN to get GPI
  • 计算“查找”结果的最佳方法是什么?

    我当前的解决方案是find
  • Python:两个相同长度列表的元素连接

    我有两个相同长度的列表 a 1 2 2 3 3 4 b 9 10 11 12 13 19 20 并想将它们结合起来 c 1 2 9 2 3 10 11 3 4 12 13 19 20 我这样做是通过 c for i in range 0 l
  • python pandas 解析带有月份名称的日期时间字符串

    有人可以向我指出一种格式或代码片段来解析格式如下的日期吗 04SEP12 00 00 00 That dd mm YY HH MM SS不起作用 使用格式字符串 d b y H M S 并将其作为格式传递to datetime 您可以在中找
  • iOS - 在 Localized.strings 中用粗体字符串强调

    有没有办法像这样在可本地化文件中加粗一些单词 Pending network connection b Pending b network connection 我里面有这个字符串 我只想强调某些单词 camSave To complete
  • 半屏视图,iOS 侧边栏菜单

    因为我想在屏幕左侧显示许多菜单 就像下面一样 这是一个新的 Facebook 应用程序 当您单击其周围显示为红色方块的栏时 左侧的列表视图将在之后出现在我的应用程序中滑动右侧部分是否有任何 SDK 可以添加此内容 请帮助我 看看吧 http
  • 从 HTML 导出到 PDF (C#) [重复]

    这个问题在这里已经有答案了 可能的重复 在 NET 中将 HTML 转换为 PDF 在我们的应用程序中 我们制作 html 文档作为报告和导出 但现在我们的客户想要一个将该文档保存在他们的电脑上的按钮 问题是该文档包含图像 您可以使用以下代
  • CSS3选择器:带有类名的第一个类型?

    是否可以使用 CSS3 选择器 first of type选择具有给定类名的第一个元素 我的测试没有成功 所以我想是不是 代码 http jsfiddle net YWY4L p first of type color blue p myc
  • 将数字写入文本文件 - 批处理文件

    这应该是一个简单的问题 我对自己很失望 但我一生都找不到解决方案 我正在尝试将数字 1 写入 BAT 脚本中的文本文件 如果我执行下面的操作 它会起作用 但会在我不能拥有的数字后面留下一个尾随空格 我知道您可以通过删除 1 和 gt 之间的
  • JavaFX 中具有自动拉伸图块的 TilePane

    JavaFX 有没有办法充分利用 TilePane 或 FlowPaneand网格窗格 这是我想要实现的目标 首先 我喜欢 GridPane 的想法 我可以在其中设置一个 M N 网格 该网格会在其父容器内自动调整大小 以将空间平均划分为