在 JavaFX 中使标签占据 HBox 上的所有可用空间

Bas*_*que 2 java layout javafx

在 JavaFX 21 中,我希望HBox包含 3 个元素、一个标签和两个按钮。

\n
HBox rowBox = new HBox ( label , buttonX , buttonY );\n
Run Code Online (Sandbox Code Playgroud)\n

默认情况下,小部件全部堆积在左侧。

\n

就像这样,文本很少,如果我们想象我的外部方括号是边界HBox,内部方括号是每个按钮的边界:

\n
\n

[ Short text. [ buttonX ] [ buttonY] ]

\n
\n

\xe2\x80\xa6 或带有更多文本的:

\n
\n

[ Or lots and lots and lots of text. [ buttonX ] [ buttonY] ]

\n
\n

但我希望这两个按钮始终位于最右侧,如下所示:

\n
\n

[ Short text. [ buttonX ] [ buttonY] ]

\n
\n
\n

[ Or lots and lots and lots of text. [ buttonX ] [ buttonY] ]

\n
\n

我试过HBox.setHgrow

\n
HBox.setHgrow ( label , Priority.ALWAYS );\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\xa6 但其效果并没有给我带来任何好处 \xe2\x80\x94\xc2\xa0 元素保持在相同的位置。相反,我希望盒子的所有未分配空间都达到标签的宽度。我希望标签将两个按钮“推”到盒子的右侧。

\n

我试图用一个单一的布局来完成这个布局,HBox以便我可以沿着文本的基线整齐地对齐小部件。

\n
rowBox.setAlignment ( Pos.BASELINE_LEFT );\n
Run Code Online (Sandbox Code Playgroud)\n

有没有办法将所有额外空间分配给标签?

\n

如果没有,是否有其他方法可以使该按钮处于正确的布局?

\n

小智 5

HBox在 JavaFX 中,要实现您所描述的布局\xe2\x80\x94,其中两个按钮始终位于最右侧,并且标签占据所有剩余空间\xe2\x80\x94,您可以使用、Region和 的组合HBox.setHgrow

\n

就是这样:

\n
    \n
  1. 创建一个Region充当标签和按钮之间的间隔物。
  2. \n
  3. 用于HBox.setHgrow使Region占用所有可用空间。
  4. \n
\n

这是一个代码示例:

\n
import javafx.application.Application;\nimport javafx.scene.Scene;\nimport javafx.scene.control.Button;\nimport javafx.scene.control.Label;\nimport javafx.scene.layout.HBox;\nimport javafx.scene.layout.Priority;\nimport javafx.scene.layout.Region;\nimport javafx.stage.Stage;\n\npublic class Main extends Application {\n\n    @Override\n    public void start(Stage primaryStage) {\n        Label label = new Label("Or lots and lots and lots of text.");\n        \n        Button buttonX = new Button("buttonX");\n        Button buttonY = new Button("buttonY");\n        \n        // Create a region to act as a horizontal spacer\n        Region spacer = new Region();\n        \n        // Make the spacer Region expand as much as possible\n        HBox.setHgrow(spacer, Priority.ALWAYS);\n        \n        HBox hbox = new HBox(label, spacer, buttonX, buttonY);\n        \n        Scene scene = new Scene(hbox, 400, 100);\n        \n        primaryStage.setScene(scene);\n        primaryStage.show();\n    }\n\n    public static void main(String[] args) {\n        launch(args);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

在此示例中,Region命名spacer将占据 中所有额外的水平空间HBox,将按钮推到最右侧。标签将仅占用其文本所需的空间,同时spacer填充剩余空间。这可以确保无论标签的宽度如何,您的按钮都保留在最右侧。

\n