如何在 JavaFX 中使用 HBox 将某些元素放置在画布上的特定位置? [关闭]

Posted

技术标签:

【中文标题】如何在 JavaFX 中使用 HBox 将某些元素放置在画布上的特定位置? [关闭]【英文标题】:How can I use HBox in JavaFX, to place certain elements at a specific location on the canvas? [closed] 【发布时间】:2021-11-18 02:59:09 【问题描述】:

新手!我知道这是我整个项目中最容易做的事情,但出于一些愚蠢(我是愚蠢)的原因,我被困在这里。我想使用 HBox 将按钮放置在特定的 (x,y) 坐标处。请帮忙:

    //buttons
        //HBox hbox = new HBox(200);
        Button button = new Button(" Add to meal ");
    
    
        //get info on all customs
    
    
        Button button1 = new Button( "   Add to list   ");
    
        //hbox.getChildren().addAll(button);
    

//layout
        //add to meal button
        button.setLayoutX(125.0d);
        button.setLayoutY(325.0d);
    
        //add to list button
        button1.setLayoutX(130.0d);
        button1.setLayoutY(520.0d);

【问题讨论】:

卡住是正常的,我不用担心,不如去Oracle站点学习layout tutorials那里练习。 也让您的条款正确。您将节点放置在场景图中,而不是画布上的元素,因此标题没有意义。在 JavaFX 中,画布具有完全不同的含义。在“JavaFX 场景图”和“JavaFX 画布”上运行 Google 搜索,以了解它们的不同之处。 “我想使用 HBox 将按钮放置在特定的 (x,y) 坐标处。”.这根本不是 HBox 或任何其他布局窗格所做的。 Layout panes 根据该窗格的特定规则将子节点相对于彼此定位;在HBox 的情况下,节点水平排列成一行。无论如何,硬编码布局位置几乎总是不好的做法。只需使用布局窗格(或其组合)将组件放置在您想要的位置。 【参考方案1】:
不要使用 HBox 进行绝对定位

HBox 不是绝对定位的正确布局,它是一个自动布局管理器,可以根据内部算法自动调整大小和位置。

因此,即使您在 HBox 中手动设置子节点的布局坐标,HBox 内部的布局逻辑也会用它计算的值覆盖它们。

改为使用绝对定位的布局

还有其他布局,如 AnchorPane、Pane 和 Group,可以使用绝对定位。您应该研究它们以确定最适合您的情况。

最简单的布局,也允许调整大小是一个窗格,所以,如果你愿意,你可以用你的 HBox 代替它。

绝对定位的替代方案

对于大多数应用程序,使用提供更强大的自动化布局功能的布局窗格(例如 Hboxes、VBoxes、BorderPanes 和 GridPanes)通常比普通的 Pane 布局更好。这些通常与窗格的各种配置和布局提示结合使用,例如有关窗格内节点默认对齐方式的说明,或子节点的最小/最大/首选项大小。


以下内容并非针对该问题,而只是关于学习 JavaFX 布局的建议。

一般建议

Oracle 网站上有有用的layout tutorials 和练习。

通常最好使用自动布局管理器,而不是绝对定位。自动布局管理器有助于在不同大小的区域内创建 GUI,并支持动态调整大小。

使用 SceneBuilder 了解布局

从 Gluon 下载场景构建器。

使用 SceneBuilder 快速模拟不同的布局。

使用预览功能尝试布局,看看它们如何响应交互和调整大小。

将 SceneBuilder 输出导出到 fxml 和控制器骨架,并仔细检查输出以了解视觉设计如何映射到代码。

在 SceneBuilder 中创建和模拟布局比在 Java 代码中更容易、更高效。

但是不要仅仅依靠 SceneBuilder 来学习布局,还要用 Java 代码编写布局逻辑,这样你就知道该怎么做了。

【讨论】:

以上是关于如何在 JavaFX 中使用 HBox 将某些元素放置在画布上的特定位置? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Javafx 中 GridPane 中的 HBox

如何在 javafx 中设置带有子窗口的菜单栏?

如何使用 GridPane JavaFX 使按钮跨越多个列/行?

javafx中已经创建的scene的宽高能改变吗?怎么改呢?

将一个vBox置于JavaFx中BorderPane的中间

JavaFX的同一个HBox下拖动下拉条左側button乱跳动的问题?